diff options
| author | Cyrill Gorcunov <gorcunov@gmail.com> | 2007-07-21 07:37:18 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-21 20:49:14 -0400 |
| commit | 28de7948a896763bc97ccd416bba5b9422158350 (patch) | |
| tree | abee128b137a6fa9fa4104b7bbc4ee409467c38f /fs/udf | |
| parent | 71133027febfabd501fde7583b30008224f4d799 (diff) | |
UDF: coding style conversion - lindent fixups
This patch fixes up sources after conversion by Lindent.
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
Cc: Jan Kara <jack@ucw.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/udf')
| -rw-r--r-- | fs/udf/balloc.c | 420 | ||||
| -rw-r--r-- | fs/udf/crc.c | 4 | ||||
| -rw-r--r-- | fs/udf/dir.c | 60 | ||||
| -rw-r--r-- | fs/udf/directory.c | 68 | ||||
| -rw-r--r-- | fs/udf/ecma_167.h | 684 | ||||
| -rw-r--r-- | fs/udf/file.c | 72 | ||||
| -rw-r--r-- | fs/udf/fsync.c | 2 | ||||
| -rw-r--r-- | fs/udf/ialloc.c | 38 | ||||
| -rw-r--r-- | fs/udf/inode.c | 948 | ||||
| -rw-r--r-- | fs/udf/lowlevel.c | 4 | ||||
| -rw-r--r-- | fs/udf/misc.c | 87 | ||||
| -rw-r--r-- | fs/udf/namei.c | 410 | ||||
| -rw-r--r-- | fs/udf/osta_udf.h | 164 | ||||
| -rw-r--r-- | fs/udf/partition.c | 212 | ||||
| -rw-r--r-- | fs/udf/super.c | 1023 | ||||
| -rw-r--r-- | fs/udf/symlink.c | 14 | ||||
| -rw-r--r-- | fs/udf/truncate.c | 113 | ||||
| -rw-r--r-- | fs/udf/udf_i.h | 2 | ||||
| -rw-r--r-- | fs/udf/udf_sb.h | 26 | ||||
| -rw-r--r-- | fs/udf/udfdecl.h | 4 | ||||
| -rw-r--r-- | fs/udf/udfend.h | 20 | ||||
| -rw-r--r-- | fs/udf/udftime.c | 82 | ||||
| -rw-r--r-- | fs/udf/unicode.c | 155 |
23 files changed, 1910 insertions, 2702 deletions
diff --git a/fs/udf/balloc.c b/fs/udf/balloc.c index ef48d094dd2b..276f7207a564 100644 --- a/fs/udf/balloc.c +++ b/fs/udf/balloc.c | |||
| @@ -70,9 +70,9 @@ static inline int find_next_one_bit(void *addr, int size, int offset) | |||
| 70 | if (!size) | 70 | if (!size) |
| 71 | return result; | 71 | return result; |
| 72 | tmp = leBPL_to_cpup(p); | 72 | tmp = leBPL_to_cpup(p); |
| 73 | found_first: | 73 | found_first: |
| 74 | tmp &= ~0UL >> (BITS_PER_LONG - size); | 74 | tmp &= ~0UL >> (BITS_PER_LONG - size); |
| 75 | found_middle: | 75 | found_middle: |
| 76 | return result + ffz(~tmp); | 76 | return result + ffz(~tmp); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| @@ -110,11 +110,11 @@ static int __load_block_bitmap(struct super_block *sb, | |||
| 110 | nr_groups); | 110 | nr_groups); |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | if (bitmap->s_block_bitmap[block_group]) | 113 | if (bitmap->s_block_bitmap[block_group]) { |
| 114 | return block_group; | 114 | return block_group; |
| 115 | else { | 115 | } else { |
| 116 | retval = | 116 | retval = read_block_bitmap(sb, bitmap, block_group, |
| 117 | read_block_bitmap(sb, bitmap, block_group, block_group); | 117 | block_group); |
| 118 | if (retval < 0) | 118 | if (retval < 0) |
| 119 | return retval; | 119 | return retval; |
| 120 | return block_group; | 120 | return block_group; |
| @@ -155,22 +155,16 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
| 155 | 155 | ||
| 156 | mutex_lock(&sbi->s_alloc_mutex); | 156 | mutex_lock(&sbi->s_alloc_mutex); |
| 157 | if (bloc.logicalBlockNum < 0 || | 157 | if (bloc.logicalBlockNum < 0 || |
| 158 | (bloc.logicalBlockNum + count) > UDF_SB_PARTLEN(sb, | 158 | (bloc.logicalBlockNum + count) > UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)) { |
| 159 | bloc. | 159 | udf_debug("%d < %d || %d + %d > %d\n", |
| 160 | partitionReferenceNum)) | 160 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, |
| 161 | { | 161 | UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)); |
| 162 | udf_debug("%d < %d || %d + %d > %d\n", bloc.logicalBlockNum, 0, | ||
| 163 | bloc.logicalBlockNum, count, UDF_SB_PARTLEN(sb, | ||
| 164 | bloc. | ||
| 165 | partitionReferenceNum)); | ||
| 166 | goto error_return; | 162 | goto error_return; |
| 167 | } | 163 | } |
| 168 | 164 | ||
| 169 | block = | 165 | block = bloc.logicalBlockNum + offset + (sizeof(struct spaceBitmapDesc) << 3); |
| 170 | bloc.logicalBlockNum + offset + | ||
| 171 | (sizeof(struct spaceBitmapDesc) << 3); | ||
| 172 | 166 | ||
| 173 | do_more: | 167 | do_more: |
| 174 | overflow = 0; | 168 | overflow = 0; |
| 175 | block_group = block >> (sb->s_blocksize_bits + 3); | 169 | block_group = block >> (sb->s_blocksize_bits + 3); |
| 176 | bit = block % (sb->s_blocksize << 3); | 170 | bit = block % (sb->s_blocksize << 3); |
| @@ -190,18 +184,13 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
| 190 | for (i = 0; i < count; i++) { | 184 | for (i = 0; i < count; i++) { |
| 191 | if (udf_set_bit(bit + i, bh->b_data)) { | 185 | if (udf_set_bit(bit + i, bh->b_data)) { |
| 192 | udf_debug("bit %ld already set\n", bit + i); | 186 | udf_debug("bit %ld already set\n", bit + i); |
| 193 | udf_debug("byte=%2x\n", | 187 | udf_debug("byte=%2x\n", ((char *)bh->b_data)[(bit + i) >> 3]); |
| 194 | ((char *)bh->b_data)[(bit + i) >> 3]); | ||
| 195 | } else { | 188 | } else { |
| 196 | if (inode) | 189 | if (inode) |
| 197 | DQUOT_FREE_BLOCK(inode, 1); | 190 | DQUOT_FREE_BLOCK(inode, 1); |
| 198 | if (UDF_SB_LVIDBH(sb)) { | 191 | if (UDF_SB_LVIDBH(sb)) { |
| 199 | UDF_SB_LVID(sb)-> | 192 | UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)] = |
| 200 | freeSpaceTable[UDF_SB_PARTITION(sb)] = | 193 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]) + 1); |
| 201 | cpu_to_le32(le32_to_cpu | ||
| 202 | (UDF_SB_LVID(sb)-> | ||
| 203 | freeSpaceTable[UDF_SB_PARTITION | ||
| 204 | (sb)]) + 1); | ||
| 205 | } | 194 | } |
| 206 | } | 195 | } |
| 207 | } | 196 | } |
| @@ -211,7 +200,7 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
| 211 | count = overflow; | 200 | count = overflow; |
| 212 | goto do_more; | 201 | goto do_more; |
| 213 | } | 202 | } |
| 214 | error_return: | 203 | error_return: |
| 215 | sb->s_dirt = 1; | 204 | sb->s_dirt = 1; |
| 216 | if (UDF_SB_LVIDBH(sb)) | 205 | if (UDF_SB_LVIDBH(sb)) |
| 217 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 206 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
| @@ -238,7 +227,7 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, | |||
| 238 | if (first_block + block_count > UDF_SB_PARTLEN(sb, partition)) | 227 | if (first_block + block_count > UDF_SB_PARTLEN(sb, partition)) |
| 239 | block_count = UDF_SB_PARTLEN(sb, partition) - first_block; | 228 | block_count = UDF_SB_PARTLEN(sb, partition) - first_block; |
| 240 | 229 | ||
| 241 | repeat: | 230 | repeat: |
| 242 | nr_groups = (UDF_SB_PARTLEN(sb, partition) + | 231 | nr_groups = (UDF_SB_PARTLEN(sb, partition) + |
| 243 | (sizeof(struct spaceBitmapDesc) << 3) + | 232 | (sizeof(struct spaceBitmapDesc) << 3) + |
| 244 | (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); | 233 | (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); |
| @@ -254,11 +243,11 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, | |||
| 254 | bit = block % (sb->s_blocksize << 3); | 243 | bit = block % (sb->s_blocksize << 3); |
| 255 | 244 | ||
| 256 | while (bit < (sb->s_blocksize << 3) && block_count > 0) { | 245 | while (bit < (sb->s_blocksize << 3) && block_count > 0) { |
| 257 | if (!udf_test_bit(bit, bh->b_data)) | 246 | if (!udf_test_bit(bit, bh->b_data)) { |
| 258 | goto out; | 247 | goto out; |
| 259 | else if (DQUOT_PREALLOC_BLOCK(inode, 1)) | 248 | } else if (DQUOT_PREALLOC_BLOCK(inode, 1)) { |
| 260 | goto out; | 249 | goto out; |
| 261 | else if (!udf_clear_bit(bit, bh->b_data)) { | 250 | } else if (!udf_clear_bit(bit, bh->b_data)) { |
| 262 | udf_debug("bit already cleared for block %d\n", bit); | 251 | udf_debug("bit already cleared for block %d\n", bit); |
| 263 | DQUOT_FREE_BLOCK(inode, 1); | 252 | DQUOT_FREE_BLOCK(inode, 1); |
| 264 | goto out; | 253 | goto out; |
| @@ -271,12 +260,10 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, | |||
| 271 | mark_buffer_dirty(bh); | 260 | mark_buffer_dirty(bh); |
| 272 | if (block_count > 0) | 261 | if (block_count > 0) |
| 273 | goto repeat; | 262 | goto repeat; |
| 274 | out: | 263 | out: |
| 275 | if (UDF_SB_LVIDBH(sb)) { | 264 | if (UDF_SB_LVIDBH(sb)) { |
| 276 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 265 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = |
| 277 | cpu_to_le32(le32_to_cpu | 266 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - alloc_count); |
| 278 | (UDF_SB_LVID(sb)->freeSpaceTable[partition]) - | ||
| 279 | alloc_count); | ||
| 280 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 267 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
| 281 | } | 268 | } |
| 282 | sb->s_dirt = 1; | 269 | sb->s_dirt = 1; |
| @@ -299,7 +286,7 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 299 | *err = -ENOSPC; | 286 | *err = -ENOSPC; |
| 300 | mutex_lock(&sbi->s_alloc_mutex); | 287 | mutex_lock(&sbi->s_alloc_mutex); |
| 301 | 288 | ||
| 302 | repeat: | 289 | repeat: |
| 303 | if (goal < 0 || goal >= UDF_SB_PARTLEN(sb, partition)) | 290 | if (goal < 0 || goal >= UDF_SB_PARTLEN(sb, partition)) |
| 304 | goal = 0; | 291 | goal = 0; |
| 305 | 292 | ||
| @@ -312,31 +299,27 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 312 | if (bitmap_nr < 0) | 299 | if (bitmap_nr < 0) |
| 313 | goto error_return; | 300 | goto error_return; |
| 314 | bh = bitmap->s_block_bitmap[bitmap_nr]; | 301 | bh = bitmap->s_block_bitmap[bitmap_nr]; |
| 315 | ptr = | 302 | ptr = memscan((char *)bh->b_data + group_start, 0xFF, |
| 316 | memscan((char *)bh->b_data + group_start, 0xFF, | 303 | sb->s_blocksize - group_start); |
| 317 | sb->s_blocksize - group_start); | ||
| 318 | 304 | ||
| 319 | if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) { | 305 | if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) { |
| 320 | bit = block % (sb->s_blocksize << 3); | 306 | bit = block % (sb->s_blocksize << 3); |
| 321 | 307 | if (udf_test_bit(bit, bh->b_data)) | |
| 322 | if (udf_test_bit(bit, bh->b_data)) { | ||
| 323 | goto got_block; | 308 | goto got_block; |
| 324 | } | 309 | |
| 325 | end_goal = (bit + 63) & ~63; | 310 | end_goal = (bit + 63) & ~63; |
| 326 | bit = udf_find_next_one_bit(bh->b_data, end_goal, bit); | 311 | bit = udf_find_next_one_bit(bh->b_data, end_goal, bit); |
| 327 | if (bit < end_goal) | 312 | if (bit < end_goal) |
| 328 | goto got_block; | 313 | goto got_block; |
| 329 | ptr = | 314 | |
| 330 | memscan((char *)bh->b_data + (bit >> 3), 0xFF, | 315 | ptr = memscan((char *)bh->b_data + (bit >> 3), 0xFF, sb->s_blocksize - ((bit + 7) >> 3)); |
| 331 | sb->s_blocksize - ((bit + 7) >> 3)); | ||
| 332 | newbit = (ptr - ((char *)bh->b_data)) << 3; | 316 | newbit = (ptr - ((char *)bh->b_data)) << 3; |
| 333 | if (newbit < sb->s_blocksize << 3) { | 317 | if (newbit < sb->s_blocksize << 3) { |
| 334 | bit = newbit; | 318 | bit = newbit; |
| 335 | goto search_back; | 319 | goto search_back; |
| 336 | } | 320 | } |
| 337 | newbit = | 321 | |
| 338 | udf_find_next_one_bit(bh->b_data, sb->s_blocksize << 3, | 322 | newbit = udf_find_next_one_bit(bh->b_data, sb->s_blocksize << 3, bit); |
| 339 | bit); | ||
| 340 | if (newbit < sb->s_blocksize << 3) { | 323 | if (newbit < sb->s_blocksize << 3) { |
| 341 | bit = newbit; | 324 | bit = newbit; |
| 342 | goto got_block; | 325 | goto got_block; |
| @@ -354,18 +337,16 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 354 | goto error_return; | 337 | goto error_return; |
| 355 | bh = bitmap->s_block_bitmap[bitmap_nr]; | 338 | bh = bitmap->s_block_bitmap[bitmap_nr]; |
| 356 | if (i < nr_groups) { | 339 | if (i < nr_groups) { |
| 357 | ptr = | 340 | ptr = memscan((char *)bh->b_data + group_start, 0xFF, |
| 358 | memscan((char *)bh->b_data + group_start, 0xFF, | 341 | sb->s_blocksize - group_start); |
| 359 | sb->s_blocksize - group_start); | ||
| 360 | if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) { | 342 | if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) { |
| 361 | bit = (ptr - ((char *)bh->b_data)) << 3; | 343 | bit = (ptr - ((char *)bh->b_data)) << 3; |
| 362 | break; | 344 | break; |
| 363 | } | 345 | } |
| 364 | } else { | 346 | } else { |
| 365 | bit = | 347 | bit = udf_find_next_one_bit((char *)bh->b_data, |
| 366 | udf_find_next_one_bit((char *)bh->b_data, | 348 | sb->s_blocksize << 3, |
| 367 | sb->s_blocksize << 3, | 349 | group_start << 3); |
| 368 | group_start << 3); | ||
| 369 | if (bit < sb->s_blocksize << 3) | 350 | if (bit < sb->s_blocksize << 3) |
| 370 | break; | 351 | break; |
| 371 | } | 352 | } |
| @@ -377,20 +358,17 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 377 | if (bit < sb->s_blocksize << 3) | 358 | if (bit < sb->s_blocksize << 3) |
| 378 | goto search_back; | 359 | goto search_back; |
| 379 | else | 360 | else |
| 380 | bit = | 361 | bit = udf_find_next_one_bit(bh->b_data, sb->s_blocksize << 3, group_start << 3); |
| 381 | udf_find_next_one_bit(bh->b_data, sb->s_blocksize << 3, | ||
| 382 | group_start << 3); | ||
| 383 | if (bit >= sb->s_blocksize << 3) { | 362 | if (bit >= sb->s_blocksize << 3) { |
| 384 | mutex_unlock(&sbi->s_alloc_mutex); | 363 | mutex_unlock(&sbi->s_alloc_mutex); |
| 385 | return 0; | 364 | return 0; |
| 386 | } | 365 | } |
| 387 | 366 | ||
| 388 | search_back: | 367 | search_back: |
| 389 | for (i = 0; | 368 | for (i = 0; i < 7 && bit > (group_start << 3) && udf_test_bit(bit - 1, bh->b_data); i++, bit--) |
| 390 | i < 7 && bit > (group_start << 3) | 369 | ; /* empty loop */ |
| 391 | && udf_test_bit(bit - 1, bh->b_data); i++, bit--) ; | ||
| 392 | 370 | ||
| 393 | got_block: | 371 | got_block: |
| 394 | 372 | ||
| 395 | /* | 373 | /* |
| 396 | * Check quota for allocation of this block. | 374 | * Check quota for allocation of this block. |
| @@ -402,7 +380,7 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 402 | } | 380 | } |
| 403 | 381 | ||
| 404 | newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) - | 382 | newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) - |
| 405 | (sizeof(struct spaceBitmapDesc) << 3); | 383 | (sizeof(struct spaceBitmapDesc) << 3); |
| 406 | 384 | ||
| 407 | if (!udf_clear_bit(bit, bh->b_data)) { | 385 | if (!udf_clear_bit(bit, bh->b_data)) { |
| 408 | udf_debug("bit already cleared for block %d\n", bit); | 386 | udf_debug("bit already cleared for block %d\n", bit); |
| @@ -413,9 +391,7 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 413 | 391 | ||
| 414 | if (UDF_SB_LVIDBH(sb)) { | 392 | if (UDF_SB_LVIDBH(sb)) { |
| 415 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 393 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = |
| 416 | cpu_to_le32(le32_to_cpu | 394 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - 1); |
| 417 | (UDF_SB_LVID(sb)->freeSpaceTable[partition]) - | ||
| 418 | 1); | ||
| 419 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 395 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
| 420 | } | 396 | } |
| 421 | sb->s_dirt = 1; | 397 | sb->s_dirt = 1; |
| @@ -423,7 +399,7 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 423 | *err = 0; | 399 | *err = 0; |
| 424 | return newblock; | 400 | return newblock; |
| 425 | 401 | ||
| 426 | error_return: | 402 | error_return: |
| 427 | *err = -EIO; | 403 | *err = -EIO; |
| 428 | mutex_unlock(&sbi->s_alloc_mutex); | 404 | mutex_unlock(&sbi->s_alloc_mutex); |
| 429 | return 0; | 405 | return 0; |
| @@ -445,14 +421,10 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 445 | 421 | ||
| 446 | mutex_lock(&sbi->s_alloc_mutex); | 422 | mutex_lock(&sbi->s_alloc_mutex); |
| 447 | if (bloc.logicalBlockNum < 0 || | 423 | if (bloc.logicalBlockNum < 0 || |
| 448 | (bloc.logicalBlockNum + count) > UDF_SB_PARTLEN(sb, | 424 | (bloc.logicalBlockNum + count) > UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)) { |
| 449 | bloc. | 425 | udf_debug("%d < %d || %d + %d > %d\n", |
| 450 | partitionReferenceNum)) | 426 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, |
| 451 | { | 427 | UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)); |
| 452 | udf_debug("%d < %d || %d + %d > %d\n", bloc.logicalBlockNum, 0, | ||
| 453 | bloc.logicalBlockNum, count, UDF_SB_PARTLEN(sb, | ||
| 454 | bloc. | ||
| 455 | partitionReferenceNum)); | ||
| 456 | goto error_return; | 428 | goto error_return; |
| 457 | } | 429 | } |
| 458 | 430 | ||
| @@ -462,9 +434,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 462 | DQUOT_FREE_BLOCK(inode, count); | 434 | DQUOT_FREE_BLOCK(inode, count); |
| 463 | if (UDF_SB_LVIDBH(sb)) { | 435 | if (UDF_SB_LVIDBH(sb)) { |
| 464 | UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)] = | 436 | UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)] = |
| 465 | cpu_to_le32(le32_to_cpu | 437 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]) + count); |
| 466 | (UDF_SB_LVID(sb)-> | ||
| 467 | freeSpaceTable[UDF_SB_PARTITION(sb)]) + count); | ||
| 468 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 438 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
| 469 | } | 439 | } |
| 470 | 440 | ||
| @@ -476,47 +446,28 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 476 | epos.block = oepos.block = UDF_I_LOCATION(table); | 446 | epos.block = oepos.block = UDF_I_LOCATION(table); |
| 477 | epos.bh = oepos.bh = NULL; | 447 | epos.bh = oepos.bh = NULL; |
| 478 | 448 | ||
| 479 | while (count && (etype = | 449 | while (count && |
| 480 | udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { | 450 | (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { |
| 481 | if (((eloc.logicalBlockNum + (elen >> sb->s_blocksize_bits)) == | 451 | if (((eloc.logicalBlockNum + (elen >> sb->s_blocksize_bits)) == start)) { |
| 482 | start)) { | 452 | if ((0x3FFFFFFF - elen) < (count << sb->s_blocksize_bits)) { |
| 483 | if ((0x3FFFFFFF - elen) < | 453 | count -= ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); |
| 484 | (count << sb->s_blocksize_bits)) { | 454 | start += ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); |
| 485 | count -= | 455 | elen = (etype << 30) | (0x40000000 - sb->s_blocksize); |
| 486 | ((0x3FFFFFFF - | ||
| 487 | elen) >> sb->s_blocksize_bits); | ||
| 488 | start += | ||
| 489 | ((0x3FFFFFFF - | ||
| 490 | elen) >> sb->s_blocksize_bits); | ||
| 491 | elen = | ||
| 492 | (etype << 30) | (0x40000000 - | ||
| 493 | sb->s_blocksize); | ||
| 494 | } else { | 456 | } else { |
| 495 | elen = (etype << 30) | | 457 | elen = (etype << 30) | (elen + (count << sb->s_blocksize_bits)); |
| 496 | (elen + (count << sb->s_blocksize_bits)); | ||
| 497 | start += count; | 458 | start += count; |
| 498 | count = 0; | 459 | count = 0; |
| 499 | } | 460 | } |
| 500 | udf_write_aext(table, &oepos, eloc, elen, 1); | 461 | udf_write_aext(table, &oepos, eloc, elen, 1); |
| 501 | } else if (eloc.logicalBlockNum == (end + 1)) { | 462 | } else if (eloc.logicalBlockNum == (end + 1)) { |
| 502 | if ((0x3FFFFFFF - elen) < | 463 | if ((0x3FFFFFFF - elen) < (count << sb->s_blocksize_bits)) { |
| 503 | (count << sb->s_blocksize_bits)) { | 464 | count -= ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); |
| 504 | count -= | 465 | end -= ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); |
| 505 | ((0x3FFFFFFF - | 466 | eloc.logicalBlockNum -= ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); |
| 506 | elen) >> sb->s_blocksize_bits); | 467 | elen = (etype << 30) | (0x40000000 - sb->s_blocksize); |
| 507 | end -= | ||
| 508 | ((0x3FFFFFFF - | ||
| 509 | elen) >> sb->s_blocksize_bits); | ||
| 510 | eloc.logicalBlockNum -= | ||
| 511 | ((0x3FFFFFFF - | ||
| 512 | elen) >> sb->s_blocksize_bits); | ||
| 513 | elen = | ||
| 514 | (etype << 30) | (0x40000000 - | ||
| 515 | sb->s_blocksize); | ||
| 516 | } else { | 468 | } else { |
| 517 | eloc.logicalBlockNum = start; | 469 | eloc.logicalBlockNum = start; |
| 518 | elen = (etype << 30) | | 470 | elen = (etype << 30) | (elen + (count << sb->s_blocksize_bits)); |
| 519 | (elen + (count << sb->s_blocksize_bits)); | ||
| 520 | end -= count; | 471 | end -= count; |
| 521 | count = 0; | 472 | count = 0; |
| 522 | } | 473 | } |
| @@ -530,21 +481,23 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 530 | get_bh(epos.bh); | 481 | get_bh(epos.bh); |
| 531 | oepos.bh = epos.bh; | 482 | oepos.bh = epos.bh; |
| 532 | oepos.offset = 0; | 483 | oepos.offset = 0; |
| 533 | } else | 484 | } else { |
| 534 | oepos.offset = epos.offset; | 485 | oepos.offset = epos.offset; |
| 486 | } | ||
| 535 | } | 487 | } |
| 536 | 488 | ||
| 537 | if (count) { | 489 | if (count) { |
| 538 | /* NOTE: we CANNOT use udf_add_aext here, as it can try to allocate | 490 | /* |
| 539 | a new block, and since we hold the super block lock already | 491 | * NOTE: we CANNOT use udf_add_aext here, as it can try to allocate |
| 540 | very bad things would happen :) | 492 | * a new block, and since we hold the super block lock already |
| 541 | 493 | * very bad things would happen :) | |
| 542 | We copy the behavior of udf_add_aext, but instead of | 494 | * |
| 543 | trying to allocate a new block close to the existing one, | 495 | * We copy the behavior of udf_add_aext, but instead of |
| 544 | we just steal a block from the extent we are trying to add. | 496 | * trying to allocate a new block close to the existing one, |
| 545 | 497 | * we just steal a block from the extent we are trying to add. | |
| 546 | It would be nice if the blocks were close together, but it | 498 | * |
| 547 | isn't required. | 499 | * It would be nice if the blocks were close together, but it |
| 500 | * isn't required. | ||
| 548 | */ | 501 | */ |
| 549 | 502 | ||
| 550 | int adsize; | 503 | int adsize; |
| @@ -553,13 +506,14 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 553 | struct allocExtDesc *aed; | 506 | struct allocExtDesc *aed; |
| 554 | 507 | ||
| 555 | eloc.logicalBlockNum = start; | 508 | eloc.logicalBlockNum = start; |
| 556 | elen = EXT_RECORDED_ALLOCATED | (count << sb->s_blocksize_bits); | 509 | elen = EXT_RECORDED_ALLOCATED | |
| 510 | (count << sb->s_blocksize_bits); | ||
| 557 | 511 | ||
| 558 | if (UDF_I_ALLOCTYPE(table) == ICBTAG_FLAG_AD_SHORT) | 512 | if (UDF_I_ALLOCTYPE(table) == ICBTAG_FLAG_AD_SHORT) { |
| 559 | adsize = sizeof(short_ad); | 513 | adsize = sizeof(short_ad); |
| 560 | else if (UDF_I_ALLOCTYPE(table) == ICBTAG_FLAG_AD_LONG) | 514 | } else if (UDF_I_ALLOCTYPE(table) == ICBTAG_FLAG_AD_LONG) { |
| 561 | adsize = sizeof(long_ad); | 515 | adsize = sizeof(long_ad); |
| 562 | else { | 516 | } else { |
| 563 | brelse(oepos.bh); | 517 | brelse(oepos.bh); |
| 564 | brelse(epos.bh); | 518 | brelse(epos.bh); |
| 565 | goto error_return; | 519 | goto error_return; |
| @@ -577,28 +531,21 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 577 | eloc.logicalBlockNum++; | 531 | eloc.logicalBlockNum++; |
| 578 | elen -= sb->s_blocksize; | 532 | elen -= sb->s_blocksize; |
| 579 | 533 | ||
| 580 | if (!(epos.bh = udf_tread(sb, | 534 | if (!(epos.bh = udf_tread(sb, udf_get_lb_pblock(sb, epos.block, 0)))) { |
| 581 | udf_get_lb_pblock(sb, | ||
| 582 | epos.block, | ||
| 583 | 0)))) { | ||
| 584 | brelse(oepos.bh); | 535 | brelse(oepos.bh); |
| 585 | goto error_return; | 536 | goto error_return; |
| 586 | } | 537 | } |
| 587 | aed = (struct allocExtDesc *)(epos.bh->b_data); | 538 | aed = (struct allocExtDesc *)(epos.bh->b_data); |
| 588 | aed->previousAllocExtLocation = | 539 | aed->previousAllocExtLocation = cpu_to_le32(oepos.block.logicalBlockNum); |
| 589 | cpu_to_le32(oepos.block.logicalBlockNum); | ||
| 590 | if (epos.offset + adsize > sb->s_blocksize) { | 540 | if (epos.offset + adsize > sb->s_blocksize) { |
| 591 | loffset = epos.offset; | 541 | loffset = epos.offset; |
| 592 | aed->lengthAllocDescs = cpu_to_le32(adsize); | 542 | aed->lengthAllocDescs = cpu_to_le32(adsize); |
| 593 | sptr = UDF_I_DATA(inode) + epos.offset - | 543 | sptr = UDF_I_DATA(inode) + epos.offset - |
| 594 | udf_file_entry_alloc_offset(inode) + | 544 | udf_file_entry_alloc_offset(inode) + |
| 595 | UDF_I_LENEATTR(inode) - adsize; | 545 | UDF_I_LENEATTR(inode) - adsize; |
| 596 | dptr = | 546 | dptr = epos.bh->b_data + sizeof(struct allocExtDesc); |
| 597 | epos.bh->b_data + | ||
| 598 | sizeof(struct allocExtDesc); | ||
| 599 | memcpy(dptr, sptr, adsize); | 547 | memcpy(dptr, sptr, adsize); |
| 600 | epos.offset = | 548 | epos.offset = sizeof(struct allocExtDesc) + adsize; |
| 601 | sizeof(struct allocExtDesc) + adsize; | ||
| 602 | } else { | 549 | } else { |
| 603 | loffset = epos.offset + adsize; | 550 | loffset = epos.offset + adsize; |
| 604 | aed->lengthAllocDescs = cpu_to_le32(0); | 551 | aed->lengthAllocDescs = cpu_to_le32(0); |
| @@ -606,60 +553,46 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 606 | epos.offset = sizeof(struct allocExtDesc); | 553 | epos.offset = sizeof(struct allocExtDesc); |
| 607 | 554 | ||
| 608 | if (oepos.bh) { | 555 | if (oepos.bh) { |
| 609 | aed = | 556 | aed = (struct allocExtDesc *)oepos.bh->b_data; |
| 610 | (struct allocExtDesc *)oepos.bh-> | ||
| 611 | b_data; | ||
| 612 | aed->lengthAllocDescs = | 557 | aed->lengthAllocDescs = |
| 613 | cpu_to_le32(le32_to_cpu | 558 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); |
| 614 | (aed-> | ||
| 615 | lengthAllocDescs) + | ||
| 616 | adsize); | ||
| 617 | } else { | 559 | } else { |
| 618 | UDF_I_LENALLOC(table) += adsize; | 560 | UDF_I_LENALLOC(table) += adsize; |
| 619 | mark_inode_dirty(table); | 561 | mark_inode_dirty(table); |
| 620 | } | 562 | } |
| 621 | } | 563 | } |
| 622 | if (UDF_SB_UDFREV(sb) >= 0x0200) | 564 | if (UDF_SB_UDFREV(sb) >= 0x0200) |
| 623 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, 3, | 565 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, 3, 1, |
| 624 | 1, epos.block.logicalBlockNum, | 566 | epos.block.logicalBlockNum, sizeof(tag)); |
| 625 | sizeof(tag)); | ||
| 626 | else | 567 | else |
| 627 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, 2, | 568 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, 2, 1, |
| 628 | 1, epos.block.logicalBlockNum, | 569 | epos.block.logicalBlockNum, sizeof(tag)); |
| 629 | sizeof(tag)); | 570 | |
| 630 | switch (UDF_I_ALLOCTYPE(table)) { | 571 | switch (UDF_I_ALLOCTYPE(table)) { |
| 631 | case ICBTAG_FLAG_AD_SHORT: | 572 | case ICBTAG_FLAG_AD_SHORT: |
| 632 | { | 573 | sad = (short_ad *)sptr; |
| 633 | sad = (short_ad *) sptr; | 574 | sad->extLength = cpu_to_le32( |
| 634 | sad->extLength = | 575 | EXT_NEXT_EXTENT_ALLOCDECS | |
| 635 | cpu_to_le32 | 576 | sb->s_blocksize); |
| 636 | (EXT_NEXT_EXTENT_ALLOCDECS | sb-> | 577 | sad->extPosition = cpu_to_le32(epos.block.logicalBlockNum); |
| 637 | s_blocksize); | ||
| 638 | sad->extPosition = | ||
| 639 | cpu_to_le32(epos.block. | ||
| 640 | logicalBlockNum); | ||
| 641 | break; | 578 | break; |
| 642 | } | 579 | case ICBTAG_FLAG_AD_LONG: |
| 643 | case ICBTAG_FLAG_AD_LONG: | 580 | lad = (long_ad *)sptr; |
| 644 | { | 581 | lad->extLength = cpu_to_le32( |
| 645 | lad = (long_ad *) sptr; | 582 | EXT_NEXT_EXTENT_ALLOCDECS | |
| 646 | lad->extLength = | 583 | sb->s_blocksize); |
| 647 | cpu_to_le32 | 584 | lad->extLocation = cpu_to_lelb(epos.block); |
| 648 | (EXT_NEXT_EXTENT_ALLOCDECS | sb-> | ||
| 649 | s_blocksize); | ||
| 650 | lad->extLocation = | ||
| 651 | cpu_to_lelb(epos.block); | ||
| 652 | break; | 585 | break; |
| 653 | } | ||
| 654 | } | 586 | } |
| 655 | if (oepos.bh) { | 587 | if (oepos.bh) { |
| 656 | udf_update_tag(oepos.bh->b_data, loffset); | 588 | udf_update_tag(oepos.bh->b_data, loffset); |
| 657 | mark_buffer_dirty(oepos.bh); | 589 | mark_buffer_dirty(oepos.bh); |
| 658 | } else | 590 | } else { |
| 659 | mark_inode_dirty(table); | 591 | mark_inode_dirty(table); |
| 592 | } | ||
| 660 | } | 593 | } |
| 661 | 594 | ||
| 662 | if (elen) { /* It's possible that stealing the block emptied the extent */ | 595 | if (elen) { /* It's possible that stealing the block emptied the extent */ |
| 663 | udf_write_aext(table, &epos, eloc, elen, 1); | 596 | udf_write_aext(table, &epos, eloc, elen, 1); |
| 664 | 597 | ||
| 665 | if (!epos.bh) { | 598 | if (!epos.bh) { |
| @@ -668,9 +601,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 668 | } else { | 601 | } else { |
| 669 | aed = (struct allocExtDesc *)epos.bh->b_data; | 602 | aed = (struct allocExtDesc *)epos.bh->b_data; |
| 670 | aed->lengthAllocDescs = | 603 | aed->lengthAllocDescs = |
| 671 | cpu_to_le32(le32_to_cpu | 604 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); |
| 672 | (aed->lengthAllocDescs) + | ||
| 673 | adsize); | ||
| 674 | udf_update_tag(epos.bh->b_data, epos.offset); | 605 | udf_update_tag(epos.bh->b_data, epos.offset); |
| 675 | mark_buffer_dirty(epos.bh); | 606 | mark_buffer_dirty(epos.bh); |
| 676 | } | 607 | } |
| @@ -680,7 +611,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 680 | brelse(epos.bh); | 611 | brelse(epos.bh); |
| 681 | brelse(oepos.bh); | 612 | brelse(oepos.bh); |
| 682 | 613 | ||
| 683 | error_return: | 614 | error_return: |
| 684 | sb->s_dirt = 1; | 615 | sb->s_dirt = 1; |
| 685 | mutex_unlock(&sbi->s_alloc_mutex); | 616 | mutex_unlock(&sbi->s_alloc_mutex); |
| 686 | return; | 617 | return; |
| @@ -714,47 +645,36 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
| 714 | epos.bh = NULL; | 645 | epos.bh = NULL; |
| 715 | eloc.logicalBlockNum = 0xFFFFFFFF; | 646 | eloc.logicalBlockNum = 0xFFFFFFFF; |
| 716 | 647 | ||
| 717 | while (first_block != eloc.logicalBlockNum && (etype = | 648 | while (first_block != eloc.logicalBlockNum && |
| 718 | udf_next_aext(table, | 649 | (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { |
| 719 | &epos, | ||
| 720 | &eloc, | ||
| 721 | &elen, | ||
| 722 | 1)) != | ||
| 723 | -1) { | ||
| 724 | udf_debug("eloc=%d, elen=%d, first_block=%d\n", | 650 | udf_debug("eloc=%d, elen=%d, first_block=%d\n", |
| 725 | eloc.logicalBlockNum, elen, first_block); | 651 | eloc.logicalBlockNum, elen, first_block); |
| 726 | ; /* empty loop body */ | 652 | ; /* empty loop body */ |
| 727 | } | 653 | } |
| 728 | 654 | ||
| 729 | if (first_block == eloc.logicalBlockNum) { | 655 | if (first_block == eloc.logicalBlockNum) { |
| 730 | epos.offset -= adsize; | 656 | epos.offset -= adsize; |
| 731 | 657 | ||
| 732 | alloc_count = (elen >> sb->s_blocksize_bits); | 658 | alloc_count = (elen >> sb->s_blocksize_bits); |
| 733 | if (inode | 659 | if (inode && DQUOT_PREALLOC_BLOCK(inode, alloc_count > block_count ? block_count : alloc_count)) { |
| 734 | && DQUOT_PREALLOC_BLOCK(inode, | ||
| 735 | alloc_count > | ||
| 736 | block_count ? block_count : | ||
| 737 | alloc_count)) | ||
| 738 | alloc_count = 0; | 660 | alloc_count = 0; |
| 739 | else if (alloc_count > block_count) { | 661 | } else if (alloc_count > block_count) { |
| 740 | alloc_count = block_count; | 662 | alloc_count = block_count; |
| 741 | eloc.logicalBlockNum += alloc_count; | 663 | eloc.logicalBlockNum += alloc_count; |
| 742 | elen -= (alloc_count << sb->s_blocksize_bits); | 664 | elen -= (alloc_count << sb->s_blocksize_bits); |
| 743 | udf_write_aext(table, &epos, eloc, (etype << 30) | elen, | 665 | udf_write_aext(table, &epos, eloc, (etype << 30) | elen, 1); |
| 744 | 1); | 666 | } else { |
| 745 | } else | 667 | udf_delete_aext(table, epos, eloc, (etype << 30) | elen); |
| 746 | udf_delete_aext(table, epos, eloc, | 668 | } |
| 747 | (etype << 30) | elen); | 669 | } else { |
| 748 | } else | ||
| 749 | alloc_count = 0; | 670 | alloc_count = 0; |
| 671 | } | ||
| 750 | 672 | ||
| 751 | brelse(epos.bh); | 673 | brelse(epos.bh); |
| 752 | 674 | ||
| 753 | if (alloc_count && UDF_SB_LVIDBH(sb)) { | 675 | if (alloc_count && UDF_SB_LVIDBH(sb)) { |
| 754 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 676 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = |
| 755 | cpu_to_le32(le32_to_cpu | 677 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - alloc_count); |
| 756 | (UDF_SB_LVID(sb)->freeSpaceTable[partition]) - | ||
| 757 | alloc_count); | ||
| 758 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 678 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
| 759 | sb->s_dirt = 1; | 679 | sb->s_dirt = 1; |
| 760 | } | 680 | } |
| @@ -797,18 +717,17 @@ static int udf_table_new_block(struct super_block *sb, | |||
| 797 | epos.block = UDF_I_LOCATION(table); | 717 | epos.block = UDF_I_LOCATION(table); |
| 798 | epos.bh = goal_epos.bh = NULL; | 718 | epos.bh = goal_epos.bh = NULL; |
| 799 | 719 | ||
| 800 | while (spread && (etype = | 720 | while (spread && |
| 801 | udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { | 721 | (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { |
| 802 | if (goal >= eloc.logicalBlockNum) { | 722 | if (goal >= eloc.logicalBlockNum) { |
| 803 | if (goal < | 723 | if (goal < eloc.logicalBlockNum + (elen >> sb->s_blocksize_bits)) |
| 804 | eloc.logicalBlockNum + | ||
| 805 | (elen >> sb->s_blocksize_bits)) | ||
| 806 | nspread = 0; | 724 | nspread = 0; |
| 807 | else | 725 | else |
| 808 | nspread = goal - eloc.logicalBlockNum - | 726 | nspread = goal - eloc.logicalBlockNum - |
| 809 | (elen >> sb->s_blocksize_bits); | 727 | (elen >> sb->s_blocksize_bits); |
| 810 | } else | 728 | } else { |
| 811 | nspread = eloc.logicalBlockNum - goal; | 729 | nspread = eloc.logicalBlockNum - goal; |
| 730 | } | ||
| 812 | 731 | ||
| 813 | if (nspread < spread) { | 732 | if (nspread < spread) { |
| 814 | spread = nspread; | 733 | spread = nspread; |
| @@ -856,9 +775,7 @@ static int udf_table_new_block(struct super_block *sb, | |||
| 856 | 775 | ||
| 857 | if (UDF_SB_LVIDBH(sb)) { | 776 | if (UDF_SB_LVIDBH(sb)) { |
| 858 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 777 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = |
| 859 | cpu_to_le32(le32_to_cpu | 778 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - 1); |
| 860 | (UDF_SB_LVID(sb)->freeSpaceTable[partition]) - | ||
| 861 | 1); | ||
| 862 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 779 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
| 863 | } | 780 | } |
| 864 | 781 | ||
| @@ -877,27 +794,23 @@ inline void udf_free_blocks(struct super_block *sb, | |||
| 877 | 794 | ||
| 878 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { | 795 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { |
| 879 | return udf_bitmap_free_blocks(sb, inode, | 796 | return udf_bitmap_free_blocks(sb, inode, |
| 880 | UDF_SB_PARTMAPS(sb)[partition]. | 797 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_bitmap, |
| 881 | s_uspace.s_bitmap, bloc, offset, | 798 | bloc, offset, count); |
| 882 | count); | 799 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 883 | } else if (UDF_SB_PARTFLAGS(sb, partition) & | ||
| 884 | UDF_PART_FLAG_UNALLOC_TABLE) { | ||
| 885 | return udf_table_free_blocks(sb, inode, | 800 | return udf_table_free_blocks(sb, inode, |
| 886 | UDF_SB_PARTMAPS(sb)[partition]. | 801 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_table, |
| 887 | s_uspace.s_table, bloc, offset, | 802 | bloc, offset, count); |
| 888 | count); | ||
| 889 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { | 803 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { |
| 890 | return udf_bitmap_free_blocks(sb, inode, | 804 | return udf_bitmap_free_blocks(sb, inode, |
| 891 | UDF_SB_PARTMAPS(sb)[partition]. | 805 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_bitmap, |
| 892 | s_fspace.s_bitmap, bloc, offset, | 806 | bloc, offset, count); |
| 893 | count); | ||
| 894 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { | 807 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { |
| 895 | return udf_table_free_blocks(sb, inode, | 808 | return udf_table_free_blocks(sb, inode, |
| 896 | UDF_SB_PARTMAPS(sb)[partition]. | 809 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_table, |
| 897 | s_fspace.s_table, bloc, offset, | 810 | bloc, offset, count); |
| 898 | count); | 811 | } else { |
| 899 | } else | ||
| 900 | return; | 812 | return; |
| 813 | } | ||
| 901 | } | 814 | } |
| 902 | 815 | ||
| 903 | inline int udf_prealloc_blocks(struct super_block *sb, | 816 | inline int udf_prealloc_blocks(struct super_block *sb, |
| @@ -907,29 +820,23 @@ inline int udf_prealloc_blocks(struct super_block *sb, | |||
| 907 | { | 820 | { |
| 908 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { | 821 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { |
| 909 | return udf_bitmap_prealloc_blocks(sb, inode, | 822 | return udf_bitmap_prealloc_blocks(sb, inode, |
| 910 | UDF_SB_PARTMAPS(sb) | 823 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_bitmap, |
| 911 | [partition].s_uspace.s_bitmap, | 824 | partition, first_block, block_count); |
| 912 | partition, first_block, | 825 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 913 | block_count); | ||
| 914 | } else if (UDF_SB_PARTFLAGS(sb, partition) & | ||
| 915 | UDF_PART_FLAG_UNALLOC_TABLE) { | ||
| 916 | return udf_table_prealloc_blocks(sb, inode, | 826 | return udf_table_prealloc_blocks(sb, inode, |
| 917 | UDF_SB_PARTMAPS(sb)[partition]. | 827 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_table, |
| 918 | s_uspace.s_table, partition, | 828 | partition, first_block, block_count); |
| 919 | first_block, block_count); | ||
| 920 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { | 829 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { |
| 921 | return udf_bitmap_prealloc_blocks(sb, inode, | 830 | return udf_bitmap_prealloc_blocks(sb, inode, |
| 922 | UDF_SB_PARTMAPS(sb) | 831 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_bitmap, |
| 923 | [partition].s_fspace.s_bitmap, | 832 | partition, first_block, block_count); |
| 924 | partition, first_block, | ||
| 925 | block_count); | ||
| 926 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { | 833 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { |
| 927 | return udf_table_prealloc_blocks(sb, inode, | 834 | return udf_table_prealloc_blocks(sb, inode, |
| 928 | UDF_SB_PARTMAPS(sb)[partition]. | 835 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_table, |
| 929 | s_fspace.s_table, partition, | 836 | partition, first_block, block_count); |
| 930 | first_block, block_count); | 837 | } else { |
| 931 | } else | ||
| 932 | return 0; | 838 | return 0; |
| 839 | } | ||
| 933 | } | 840 | } |
| 934 | 841 | ||
| 935 | inline int udf_new_block(struct super_block *sb, | 842 | inline int udf_new_block(struct super_block *sb, |
| @@ -940,26 +847,21 @@ inline int udf_new_block(struct super_block *sb, | |||
| 940 | 847 | ||
| 941 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { | 848 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { |
| 942 | ret = udf_bitmap_new_block(sb, inode, | 849 | ret = udf_bitmap_new_block(sb, inode, |
| 943 | UDF_SB_PARTMAPS(sb)[partition]. | 850 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_bitmap, |
| 944 | s_uspace.s_bitmap, partition, goal, | 851 | partition, goal, err); |
| 945 | err); | ||
| 946 | return ret; | 852 | return ret; |
| 947 | } else if (UDF_SB_PARTFLAGS(sb, partition) & | 853 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 948 | UDF_PART_FLAG_UNALLOC_TABLE) { | ||
| 949 | return udf_table_new_block(sb, inode, | 854 | return udf_table_new_block(sb, inode, |
| 950 | UDF_SB_PARTMAPS(sb)[partition]. | 855 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_table, |
| 951 | s_uspace.s_table, partition, goal, | 856 | partition, goal, err); |
| 952 | err); | ||
| 953 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { | 857 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { |
| 954 | return udf_bitmap_new_block(sb, inode, | 858 | return udf_bitmap_new_block(sb, inode, |
| 955 | UDF_SB_PARTMAPS(sb)[partition]. | 859 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_bitmap, |
| 956 | s_fspace.s_bitmap, partition, goal, | 860 | partition, goal, err); |
| 957 | err); | ||
| 958 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { | 861 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { |
| 959 | return udf_table_new_block(sb, inode, | 862 | return udf_table_new_block(sb, inode, |
| 960 | UDF_SB_PARTMAPS(sb)[partition]. | 863 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_table, |
| 961 | s_fspace.s_table, partition, goal, | 864 | partition, goal, err); |
| 962 | err); | ||
| 963 | } else { | 865 | } else { |
| 964 | *err = -EIO; | 866 | *err = -EIO; |
| 965 | return 0; | 867 | return 0; |
diff --git a/fs/udf/crc.c b/fs/udf/crc.c index ae3d49790941..85aaee5fab26 100644 --- a/fs/udf/crc.c +++ b/fs/udf/crc.c | |||
| @@ -111,7 +111,7 @@ int main(void) | |||
| 111 | return 0; | 111 | return 0; |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | #endif /* defined(TEST) */ | 114 | #endif /* defined(TEST) */ |
| 115 | 115 | ||
| 116 | /****************************************************************************/ | 116 | /****************************************************************************/ |
| 117 | #if defined(GENERATE) | 117 | #if defined(GENERATE) |
| @@ -169,4 +169,4 @@ int main(int argc, char **argv) | |||
| 169 | return 0; | 169 | return 0; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | #endif /* defined(GENERATE) */ | 172 | #endif /* defined(GENERATE) */ |
diff --git a/fs/udf/dir.c b/fs/udf/dir.c index 79bab9fe120c..9e3b9f97ddbc 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c | |||
| @@ -43,10 +43,10 @@ static int do_udf_readdir(struct inode *, struct file *, filldir_t, void *); | |||
| 43 | /* readdir and lookup functions */ | 43 | /* readdir and lookup functions */ |
| 44 | 44 | ||
| 45 | const struct file_operations udf_dir_operations = { | 45 | const struct file_operations udf_dir_operations = { |
| 46 | .read = generic_read_dir, | 46 | .read = generic_read_dir, |
| 47 | .readdir = udf_readdir, | 47 | .readdir = udf_readdir, |
| 48 | .ioctl = udf_ioctl, | 48 | .ioctl = udf_ioctl, |
| 49 | .fsync = udf_fsync_file, | 49 | .fsync = udf_fsync_file, |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | /* | 52 | /* |
| @@ -83,8 +83,7 @@ int udf_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 83 | lock_kernel(); | 83 | lock_kernel(); |
| 84 | 84 | ||
| 85 | if (filp->f_pos == 0) { | 85 | if (filp->f_pos == 0) { |
| 86 | if (filldir(dirent, ".", 1, filp->f_pos, dir->i_ino, DT_DIR) < | 86 | if (filldir(dirent, ".", 1, filp->f_pos, dir->i_ino, DT_DIR) < 0) { |
| 87 | 0) { | ||
| 88 | unlock_kernel(); | 87 | unlock_kernel(); |
| 89 | return 0; | 88 | return 0; |
| 90 | } | 89 | } |
| @@ -93,7 +92,7 @@ int udf_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 93 | 92 | ||
| 94 | result = do_udf_readdir(dir, filp, filldir, dirent); | 93 | result = do_udf_readdir(dir, filp, filldir, dirent); |
| 95 | unlock_kernel(); | 94 | unlock_kernel(); |
| 96 | return result; | 95 | return result; |
| 97 | } | 96 | } |
| 98 | 97 | ||
| 99 | static int | 98 | static int |
| @@ -125,21 +124,20 @@ do_udf_readdir(struct inode *dir, struct file *filp, filldir_t filldir, | |||
| 125 | if (nf_pos == 0) | 124 | if (nf_pos == 0) |
| 126 | nf_pos = (udf_ext0_offset(dir) >> 2); | 125 | nf_pos = (udf_ext0_offset(dir) >> 2); |
| 127 | 126 | ||
| 128 | fibh.soffset = fibh.eoffset = | 127 | fibh.soffset = fibh.eoffset = (nf_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; |
| 129 | (nf_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; | 128 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 130 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) | ||
| 131 | fibh.sbh = fibh.ebh = NULL; | 129 | fibh.sbh = fibh.ebh = NULL; |
| 132 | else if (inode_bmap(dir, nf_pos >> (dir->i_sb->s_blocksize_bits - 2), | 130 | } else if (inode_bmap(dir, nf_pos >> (dir->i_sb->s_blocksize_bits - 2), |
| 133 | &epos, &eloc, &elen, | 131 | &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { |
| 134 | &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { | ||
| 135 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 132 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); |
| 136 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 133 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
| 137 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) | 134 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) |
| 138 | epos.offset -= sizeof(short_ad); | 135 | epos.offset -= sizeof(short_ad); |
| 139 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) | 136 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) |
| 140 | epos.offset -= sizeof(long_ad); | 137 | epos.offset -= sizeof(long_ad); |
| 141 | } else | 138 | } else { |
| 142 | offset = 0; | 139 | offset = 0; |
| 140 | } | ||
| 143 | 141 | ||
| 144 | if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) { | 142 | if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) { |
| 145 | brelse(epos.bh); | 143 | brelse(epos.bh); |
| @@ -149,15 +147,11 @@ do_udf_readdir(struct inode *dir, struct file *filp, filldir_t filldir, | |||
| 149 | if (!(offset & ((16 >> (dir->i_sb->s_blocksize_bits - 9)) - 1))) { | 147 | if (!(offset & ((16 >> (dir->i_sb->s_blocksize_bits - 9)) - 1))) { |
| 150 | i = 16 >> (dir->i_sb->s_blocksize_bits - 9); | 148 | i = 16 >> (dir->i_sb->s_blocksize_bits - 9); |
| 151 | if (i + offset > (elen >> dir->i_sb->s_blocksize_bits)) | 149 | if (i + offset > (elen >> dir->i_sb->s_blocksize_bits)) |
| 152 | i = (elen >> dir->i_sb->s_blocksize_bits) - | 150 | i = (elen >> dir->i_sb->s_blocksize_bits) - offset; |
| 153 | offset; | ||
| 154 | for (num = 0; i > 0; i--) { | 151 | for (num = 0; i > 0; i--) { |
| 155 | block = | 152 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset + i); |
| 156 | udf_get_lb_pblock(dir->i_sb, eloc, | ||
| 157 | offset + i); | ||
| 158 | tmp = udf_tgetblk(dir->i_sb, block); | 153 | tmp = udf_tgetblk(dir->i_sb, block); |
| 159 | if (tmp && !buffer_uptodate(tmp) | 154 | if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) |
| 160 | && !buffer_locked(tmp)) | ||
| 161 | bha[num++] = tmp; | 155 | bha[num++] = tmp; |
| 162 | else | 156 | else |
| 163 | brelse(tmp); | 157 | brelse(tmp); |
| @@ -178,7 +172,6 @@ do_udf_readdir(struct inode *dir, struct file *filp, filldir_t filldir, | |||
| 178 | 172 | ||
| 179 | fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc, | 173 | fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc, |
| 180 | &elen, &offset); | 174 | &elen, &offset); |
| 181 | |||
| 182 | if (!fi) { | 175 | if (!fi) { |
| 183 | if (fibh.sbh != fibh.ebh) | 176 | if (fibh.sbh != fibh.ebh) |
| 184 | brelse(fibh.ebh); | 177 | brelse(fibh.ebh); |
| @@ -190,19 +183,16 @@ do_udf_readdir(struct inode *dir, struct file *filp, filldir_t filldir, | |||
| 190 | liu = le16_to_cpu(cfi.lengthOfImpUse); | 183 | liu = le16_to_cpu(cfi.lengthOfImpUse); |
| 191 | lfi = cfi.lengthFileIdent; | 184 | lfi = cfi.lengthFileIdent; |
| 192 | 185 | ||
| 193 | if (fibh.sbh == fibh.ebh) | 186 | if (fibh.sbh == fibh.ebh) { |
| 194 | nameptr = fi->fileIdent + liu; | 187 | nameptr = fi->fileIdent + liu; |
| 195 | else { | 188 | } else { |
| 196 | int poffset; /* Unpaded ending offset */ | 189 | int poffset; /* Unpaded ending offset */ |
| 197 | 190 | ||
| 198 | poffset = | 191 | poffset = fibh.soffset + sizeof(struct fileIdentDesc) + liu + lfi; |
| 199 | fibh.soffset + sizeof(struct fileIdentDesc) + liu + | ||
| 200 | lfi; | ||
| 201 | 192 | ||
| 202 | if (poffset >= lfi) | 193 | if (poffset >= lfi) { |
| 203 | nameptr = | 194 | nameptr = (char *)(fibh.ebh->b_data + poffset - lfi); |
| 204 | (char *)(fibh.ebh->b_data + poffset - lfi); | 195 | } else { |
| 205 | else { | ||
| 206 | nameptr = fname; | 196 | nameptr = fname; |
| 207 | memcpy(nameptr, fi->fileIdent + liu, | 197 | memcpy(nameptr, fi->fileIdent + liu, |
| 208 | lfi - poffset); | 198 | lfi - poffset); |
| @@ -235,17 +225,15 @@ do_udf_readdir(struct inode *dir, struct file *filp, filldir_t filldir, | |||
| 235 | } | 225 | } |
| 236 | 226 | ||
| 237 | if (flen) { | 227 | if (flen) { |
| 238 | if (filldir | 228 | if (filldir(dirent, fname, flen, filp->f_pos, iblock, dt_type) < 0) { |
| 239 | (dirent, fname, flen, filp->f_pos, iblock, | ||
| 240 | dt_type) < 0) { | ||
| 241 | if (fibh.sbh != fibh.ebh) | 229 | if (fibh.sbh != fibh.ebh) |
| 242 | brelse(fibh.ebh); | 230 | brelse(fibh.ebh); |
| 243 | brelse(fibh.sbh); | 231 | brelse(fibh.sbh); |
| 244 | brelse(epos.bh); | 232 | brelse(epos.bh); |
| 245 | return 0; | 233 | return 0; |
| 246 | } | 234 | } |
| 247 | } | 235 | } |
| 248 | } /* end while */ | 236 | } /* end while */ |
| 249 | 237 | ||
| 250 | filp->f_pos = nf_pos + 1; | 238 | filp->f_pos = nf_pos + 1; |
| 251 | 239 | ||
diff --git a/fs/udf/directory.c b/fs/udf/directory.c index 8adc77c1d579..ff8c08fd7bf5 100644 --- a/fs/udf/directory.c +++ b/fs/udf/directory.c | |||
| @@ -31,7 +31,7 @@ static uint8_t *udf_filead_read(struct inode *dir, uint8_t * tmpad, | |||
| 31 | 31 | ||
| 32 | *error = 0; | 32 | *error = 0; |
| 33 | 33 | ||
| 34 | ad = (uint8_t *) (*bh)->b_data + *offset; | 34 | ad = (uint8_t *)(*bh)->b_data + *offset; |
| 35 | *offset += ad_size; | 35 | *offset += ad_size; |
| 36 | 36 | ||
| 37 | if (!ad) { | 37 | if (!ad) { |
| @@ -51,7 +51,7 @@ static uint8_t *udf_filead_read(struct inode *dir, uint8_t * tmpad, | |||
| 51 | ad = tmpad; | 51 | ad = tmpad; |
| 52 | 52 | ||
| 53 | remainder = dir->i_sb->s_blocksize - loffset; | 53 | remainder = dir->i_sb->s_blocksize - loffset; |
| 54 | memcpy((uint8_t *) ad, (*bh)->b_data + loffset, remainder); | 54 | memcpy((uint8_t *)ad, (*bh)->b_data + loffset, remainder); |
| 55 | 55 | ||
| 56 | brelse(*bh); | 56 | brelse(*bh); |
| 57 | block = udf_get_lb_pblock(dir->i_sb, fe_loc, ++*pos); | 57 | block = udf_get_lb_pblock(dir->i_sb, fe_loc, ++*pos); |
| @@ -60,10 +60,10 @@ static uint8_t *udf_filead_read(struct inode *dir, uint8_t * tmpad, | |||
| 60 | if (!((*bh) = udf_tread(dir->i_sb, block))) | 60 | if (!((*bh) = udf_tread(dir->i_sb, block))) |
| 61 | return NULL; | 61 | return NULL; |
| 62 | 62 | ||
| 63 | memcpy((uint8_t *) ad + remainder, (*bh)->b_data, | 63 | memcpy((uint8_t *)ad + remainder, (*bh)->b_data, ad_size - remainder); |
| 64 | ad_size - remainder); | ||
| 65 | *offset = ad_size - remainder; | 64 | *offset = ad_size - remainder; |
| 66 | } | 65 | } |
| 66 | |||
| 67 | return ad; | 67 | return ad; |
| 68 | } | 68 | } |
| 69 | #endif | 69 | #endif |
| @@ -86,15 +86,13 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t * nf_pos, | |||
| 86 | (UDF_I_EFE(dir) ? | 86 | (UDF_I_EFE(dir) ? |
| 87 | sizeof(struct extendedFileEntry) : | 87 | sizeof(struct extendedFileEntry) : |
| 88 | sizeof(struct fileEntry)), | 88 | sizeof(struct fileEntry)), |
| 89 | dir->i_sb->s_blocksize, | 89 | dir->i_sb->s_blocksize, &(fibh->eoffset)); |
| 90 | &(fibh->eoffset)); | ||
| 91 | |||
| 92 | if (!fi) | 90 | if (!fi) |
| 93 | return NULL; | 91 | return NULL; |
| 94 | 92 | ||
| 95 | *nf_pos += ((fibh->eoffset - fibh->soffset) >> 2); | 93 | *nf_pos += ((fibh->eoffset - fibh->soffset) >> 2); |
| 96 | 94 | ||
| 97 | memcpy((uint8_t *) cfi, (uint8_t *) fi, | 95 | memcpy((uint8_t *)cfi, (uint8_t *)fi, |
| 98 | sizeof(struct fileIdentDesc)); | 96 | sizeof(struct fileIdentDesc)); |
| 99 | 97 | ||
| 100 | return fi; | 98 | return fi; |
| @@ -121,21 +119,14 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t * nf_pos, | |||
| 121 | return NULL; | 119 | return NULL; |
| 122 | fibh->soffset = fibh->eoffset = 0; | 120 | fibh->soffset = fibh->eoffset = 0; |
| 123 | 121 | ||
| 124 | if (! | 122 | if (!(*offset & ((16 >> (dir->i_sb->s_blocksize_bits - 9)) - 1))) { |
| 125 | (*offset & ((16 >> (dir->i_sb->s_blocksize_bits - 9)) - 1))) | ||
| 126 | { | ||
| 127 | i = 16 >> (dir->i_sb->s_blocksize_bits - 9); | 123 | i = 16 >> (dir->i_sb->s_blocksize_bits - 9); |
| 128 | if (i + *offset > | 124 | if (i + *offset > (*elen >> dir->i_sb->s_blocksize_bits)) |
| 129 | (*elen >> dir->i_sb->s_blocksize_bits)) | 125 | i = (*elen >> dir->i_sb->s_blocksize_bits)-*offset; |
| 130 | i = (*elen >> dir->i_sb->s_blocksize_bits) - | ||
| 131 | *offset; | ||
| 132 | for (num = 0; i > 0; i--) { | 126 | for (num = 0; i > 0; i--) { |
| 133 | block = | 127 | block = udf_get_lb_pblock(dir->i_sb, *eloc, *offset + i); |
| 134 | udf_get_lb_pblock(dir->i_sb, *eloc, | ||
| 135 | *offset + i); | ||
| 136 | tmp = udf_tgetblk(dir->i_sb, block); | 128 | tmp = udf_tgetblk(dir->i_sb, block); |
| 137 | if (tmp && !buffer_uptodate(tmp) | 129 | if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) |
| 138 | && !buffer_locked(tmp)) | ||
| 139 | bha[num++] = tmp; | 130 | bha[num++] = tmp; |
| 140 | else | 131 | else |
| 141 | brelse(tmp); | 132 | brelse(tmp); |
| @@ -160,7 +151,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t * nf_pos, | |||
| 160 | *nf_pos += ((fibh->eoffset - fibh->soffset) >> 2); | 151 | *nf_pos += ((fibh->eoffset - fibh->soffset) >> 2); |
| 161 | 152 | ||
| 162 | if (fibh->eoffset <= dir->i_sb->s_blocksize) { | 153 | if (fibh->eoffset <= dir->i_sb->s_blocksize) { |
| 163 | memcpy((uint8_t *) cfi, (uint8_t *) fi, | 154 | memcpy((uint8_t *)cfi, (uint8_t *)fi, |
| 164 | sizeof(struct fileIdentDesc)); | 155 | sizeof(struct fileIdentDesc)); |
| 165 | } else if (fibh->eoffset > dir->i_sb->s_blocksize) { | 156 | } else if (fibh->eoffset > dir->i_sb->s_blocksize) { |
| 166 | int lextoffset = epos->offset; | 157 | int lextoffset = epos->offset; |
| @@ -187,21 +178,17 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t * nf_pos, | |||
| 187 | if (sizeof(struct fileIdentDesc) > -fibh->soffset) { | 178 | if (sizeof(struct fileIdentDesc) > -fibh->soffset) { |
| 188 | int fi_len; | 179 | int fi_len; |
| 189 | 180 | ||
| 190 | memcpy((uint8_t *) cfi, (uint8_t *) fi, -fibh->soffset); | 181 | memcpy((uint8_t *)cfi, (uint8_t *)fi, -fibh->soffset); |
| 191 | memcpy((uint8_t *) cfi - fibh->soffset, | 182 | memcpy((uint8_t *)cfi - fibh->soffset, fibh->ebh->b_data, |
| 192 | fibh->ebh->b_data, | ||
| 193 | sizeof(struct fileIdentDesc) + fibh->soffset); | 183 | sizeof(struct fileIdentDesc) + fibh->soffset); |
| 194 | 184 | ||
| 195 | fi_len = | 185 | fi_len = (sizeof(struct fileIdentDesc) + cfi->lengthFileIdent + |
| 196 | (sizeof(struct fileIdentDesc) + | 186 | le16_to_cpu(cfi->lengthOfImpUse) + 3) & ~3; |
| 197 | cfi->lengthFileIdent + | ||
| 198 | le16_to_cpu(cfi->lengthOfImpUse) + 3) & ~3; | ||
| 199 | 187 | ||
| 200 | *nf_pos += | 188 | *nf_pos += ((fi_len - (fibh->eoffset - fibh->soffset)) >> 2); |
| 201 | ((fi_len - (fibh->eoffset - fibh->soffset)) >> 2); | ||
| 202 | fibh->eoffset = fibh->soffset + fi_len; | 189 | fibh->eoffset = fibh->soffset + fi_len; |
| 203 | } else { | 190 | } else { |
| 204 | memcpy((uint8_t *) cfi, (uint8_t *) fi, | 191 | memcpy((uint8_t *)cfi, (uint8_t *)fi, |
| 205 | sizeof(struct fileIdentDesc)); | 192 | sizeof(struct fileIdentDesc)); |
| 206 | } | 193 | } |
| 207 | } | 194 | } |
| @@ -237,9 +224,10 @@ struct fileIdentDesc *udf_get_fileident(void *buffer, int bufsize, int *offset) | |||
| 237 | } | 224 | } |
| 238 | if ((*offset + sizeof(struct fileIdentDesc)) > bufsize) { | 225 | if ((*offset + sizeof(struct fileIdentDesc)) > bufsize) { |
| 239 | lengthThisIdent = sizeof(struct fileIdentDesc); | 226 | lengthThisIdent = sizeof(struct fileIdentDesc); |
| 240 | } else | 227 | } else { |
| 241 | lengthThisIdent = sizeof(struct fileIdentDesc) + | 228 | lengthThisIdent = sizeof(struct fileIdentDesc) + |
| 242 | fi->lengthFileIdent + le16_to_cpu(fi->lengthOfImpUse); | 229 | fi->lengthFileIdent + le16_to_cpu(fi->lengthOfImpUse); |
| 230 | } | ||
| 243 | 231 | ||
| 244 | /* we need to figure padding, too! */ | 232 | /* we need to figure padding, too! */ |
| 245 | padlen = lengthThisIdent % UDF_NAME_PAD; | 233 | padlen = lengthThisIdent % UDF_NAME_PAD; |
| @@ -270,22 +258,20 @@ static extent_ad *udf_get_fileextent(void *buffer, int bufsize, int *offset) | |||
| 270 | return NULL; | 258 | return NULL; |
| 271 | } | 259 | } |
| 272 | 260 | ||
| 273 | ptr = | 261 | ptr = (uint8_t *)(fe->extendedAttr) + le32_to_cpu(fe->lengthExtendedAttr); |
| 274 | (uint8_t *) (fe->extendedAttr) + | ||
| 275 | le32_to_cpu(fe->lengthExtendedAttr); | ||
| 276 | 262 | ||
| 277 | if ((*offset > 0) && (*offset < le32_to_cpu(fe->lengthAllocDescs))) { | 263 | if ((*offset > 0) && (*offset < le32_to_cpu(fe->lengthAllocDescs))) { |
| 278 | ptr += *offset; | 264 | ptr += *offset; |
| 279 | } | 265 | } |
| 280 | 266 | ||
| 281 | ext = (extent_ad *) ptr; | 267 | ext = (extent_ad *)ptr; |
| 282 | 268 | ||
| 283 | *offset = *offset + sizeof(extent_ad); | 269 | *offset = *offset + sizeof(extent_ad); |
| 284 | return ext; | 270 | return ext; |
| 285 | } | 271 | } |
| 286 | #endif | 272 | #endif |
| 287 | 273 | ||
| 288 | short_ad *udf_get_fileshortad(uint8_t * ptr, int maxoffset, int *offset, | 274 | short_ad *udf_get_fileshortad(uint8_t *ptr, int maxoffset, int *offset, |
| 289 | int inc) | 275 | int inc) |
| 290 | { | 276 | { |
| 291 | short_ad *sa; | 277 | short_ad *sa; |
| @@ -297,7 +283,7 @@ short_ad *udf_get_fileshortad(uint8_t * ptr, int maxoffset, int *offset, | |||
| 297 | 283 | ||
| 298 | if ((*offset < 0) || ((*offset + sizeof(short_ad)) > maxoffset)) | 284 | if ((*offset < 0) || ((*offset + sizeof(short_ad)) > maxoffset)) |
| 299 | return NULL; | 285 | return NULL; |
| 300 | else if ((sa = (short_ad *) ptr)->extLength == 0) | 286 | else if ((sa = (short_ad *)ptr)->extLength == 0) |
| 301 | return NULL; | 287 | return NULL; |
| 302 | 288 | ||
| 303 | if (inc) | 289 | if (inc) |
| @@ -305,7 +291,7 @@ short_ad *udf_get_fileshortad(uint8_t * ptr, int maxoffset, int *offset, | |||
| 305 | return sa; | 291 | return sa; |
| 306 | } | 292 | } |
| 307 | 293 | ||
| 308 | long_ad *udf_get_filelongad(uint8_t * ptr, int maxoffset, int *offset, int inc) | 294 | long_ad *udf_get_filelongad(uint8_t *ptr, int maxoffset, int *offset, int inc) |
| 309 | { | 295 | { |
| 310 | long_ad *la; | 296 | long_ad *la; |
| 311 | 297 | ||
| @@ -316,7 +302,7 @@ long_ad *udf_get_filelongad(uint8_t * ptr, int maxoffset, int *offset, int inc) | |||
| 316 | 302 | ||
| 317 | if ((*offset < 0) || ((*offset + sizeof(long_ad)) > maxoffset)) | 303 | if ((*offset < 0) || ((*offset + sizeof(long_ad)) > maxoffset)) |
| 318 | return NULL; | 304 | return NULL; |
| 319 | else if ((la = (long_ad *) ptr)->extLength == 0) | 305 | else if ((la = (long_ad *)ptr)->extLength == 0) |
| 320 | return NULL; | 306 | return NULL; |
| 321 | 307 | ||
| 322 | if (inc) | 308 | if (inc) |
diff --git a/fs/udf/ecma_167.h b/fs/udf/ecma_167.h index 294ce2daa03a..56387711589b 100644 --- a/fs/udf/ecma_167.h +++ b/fs/udf/ecma_167.h | |||
| @@ -39,8 +39,8 @@ | |||
| 39 | 39 | ||
| 40 | /* Character set specification (ECMA 167r3 1/7.2.1) */ | 40 | /* Character set specification (ECMA 167r3 1/7.2.1) */ |
| 41 | typedef struct { | 41 | typedef struct { |
| 42 | uint8_t charSetType; | 42 | uint8_t charSetType; |
| 43 | uint8_t charSetInfo[63]; | 43 | uint8_t charSetInfo[63]; |
| 44 | } __attribute__ ((packed)) charspec; | 44 | } __attribute__ ((packed)) charspec; |
| 45 | 45 | ||
| 46 | /* Character Set Type (ECMA 167r3 1/7.2.1.1) */ | 46 | /* Character Set Type (ECMA 167r3 1/7.2.1.1) */ |
| @@ -54,33 +54,33 @@ typedef struct { | |||
| 54 | #define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */ | 54 | #define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */ |
| 55 | #define CHARSPEC_TYPE_CS8 0x08 /* (1/7.2.10) */ | 55 | #define CHARSPEC_TYPE_CS8 0x08 /* (1/7.2.10) */ |
| 56 | 56 | ||
| 57 | typedef uint8_t dstring; | 57 | typedef uint8_t dstring; |
| 58 | 58 | ||
| 59 | /* Timestamp (ECMA 167r3 1/7.3) */ | 59 | /* Timestamp (ECMA 167r3 1/7.3) */ |
| 60 | typedef struct { | 60 | typedef struct { |
| 61 | __le16 typeAndTimezone; | 61 | __le16 typeAndTimezone; |
| 62 | __le16 year; | 62 | __le16 year; |
| 63 | uint8_t month; | 63 | uint8_t month; |
| 64 | uint8_t day; | 64 | uint8_t day; |
| 65 | uint8_t hour; | 65 | uint8_t hour; |
| 66 | uint8_t minute; | 66 | uint8_t minute; |
| 67 | uint8_t second; | 67 | uint8_t second; |
| 68 | uint8_t centiseconds; | 68 | uint8_t centiseconds; |
| 69 | uint8_t hundredsOfMicroseconds; | 69 | uint8_t hundredsOfMicroseconds; |
| 70 | uint8_t microseconds; | 70 | uint8_t microseconds; |
| 71 | } __attribute__ ((packed)) timestamp; | 71 | } __attribute__ ((packed)) timestamp; |
| 72 | 72 | ||
| 73 | typedef struct { | 73 | typedef struct { |
| 74 | uint16_t typeAndTimezone; | 74 | uint16_t typeAndTimezone; |
| 75 | int16_t year; | 75 | int16_t year; |
| 76 | uint8_t month; | 76 | uint8_t month; |
| 77 | uint8_t day; | 77 | uint8_t day; |
| 78 | uint8_t hour; | 78 | uint8_t hour; |
| 79 | uint8_t minute; | 79 | uint8_t minute; |
| 80 | uint8_t second; | 80 | uint8_t second; |
| 81 | uint8_t centiseconds; | 81 | uint8_t centiseconds; |
| 82 | uint8_t hundredsOfMicroseconds; | 82 | uint8_t hundredsOfMicroseconds; |
| 83 | uint8_t microseconds; | 83 | uint8_t microseconds; |
| 84 | } __attribute__ ((packed)) kernel_timestamp; | 84 | } __attribute__ ((packed)) kernel_timestamp; |
| 85 | 85 | ||
| 86 | /* Type and Time Zone (ECMA 167r3 1/7.3.1) */ | 86 | /* Type and Time Zone (ECMA 167r3 1/7.3.1) */ |
| @@ -92,9 +92,9 @@ typedef struct { | |||
| 92 | 92 | ||
| 93 | /* Entity identifier (ECMA 167r3 1/7.4) */ | 93 | /* Entity identifier (ECMA 167r3 1/7.4) */ |
| 94 | typedef struct { | 94 | typedef struct { |
| 95 | uint8_t flags; | 95 | uint8_t flags; |
| 96 | uint8_t ident[23]; | 96 | uint8_t ident[23]; |
| 97 | uint8_t identSuffix[8]; | 97 | uint8_t identSuffix[8]; |
| 98 | } __attribute__ ((packed)) regid; | 98 | } __attribute__ ((packed)) regid; |
| 99 | 99 | ||
| 100 | /* Flags (ECMA 167r3 1/7.4.1) */ | 100 | /* Flags (ECMA 167r3 1/7.4.1) */ |
| @@ -104,10 +104,10 @@ typedef struct { | |||
| 104 | /* Volume Structure Descriptor (ECMA 167r3 2/9.1) */ | 104 | /* Volume Structure Descriptor (ECMA 167r3 2/9.1) */ |
| 105 | #define VSD_STD_ID_LEN 5 | 105 | #define VSD_STD_ID_LEN 5 |
| 106 | struct volStructDesc { | 106 | struct volStructDesc { |
| 107 | uint8_t structType; | 107 | uint8_t structType; |
| 108 | uint8_t stdIdent[VSD_STD_ID_LEN]; | 108 | uint8_t stdIdent[VSD_STD_ID_LEN]; |
| 109 | uint8_t structVersion; | 109 | uint8_t structVersion; |
| 110 | uint8_t structData[2041]; | 110 | uint8_t structData[2041]; |
| 111 | } __attribute__ ((packed)); | 111 | } __attribute__ ((packed)); |
| 112 | 112 | ||
| 113 | /* Standard Identifier (EMCA 167r2 2/9.1.2) */ | 113 | /* Standard Identifier (EMCA 167r2 2/9.1.2) */ |
| @@ -123,36 +123,36 @@ struct volStructDesc { | |||
| 123 | 123 | ||
| 124 | /* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */ | 124 | /* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */ |
| 125 | struct beginningExtendedAreaDesc { | 125 | struct beginningExtendedAreaDesc { |
| 126 | uint8_t structType; | 126 | uint8_t structType; |
| 127 | uint8_t stdIdent[VSD_STD_ID_LEN]; | 127 | uint8_t stdIdent[VSD_STD_ID_LEN]; |
| 128 | uint8_t structVersion; | 128 | uint8_t structVersion; |
| 129 | uint8_t structData[2041]; | 129 | uint8_t structData[2041]; |
| 130 | } __attribute__ ((packed)); | 130 | } __attribute__ ((packed)); |
| 131 | 131 | ||
| 132 | /* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */ | 132 | /* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */ |
| 133 | struct terminatingExtendedAreaDesc { | 133 | struct terminatingExtendedAreaDesc { |
| 134 | uint8_t structType; | 134 | uint8_t structType; |
| 135 | uint8_t stdIdent[VSD_STD_ID_LEN]; | 135 | uint8_t stdIdent[VSD_STD_ID_LEN]; |
| 136 | uint8_t structVersion; | 136 | uint8_t structVersion; |
| 137 | uint8_t structData[2041]; | 137 | uint8_t structData[2041]; |
| 138 | } __attribute__ ((packed)); | 138 | } __attribute__ ((packed)); |
| 139 | 139 | ||
| 140 | /* Boot Descriptor (ECMA 167r3 2/9.4) */ | 140 | /* Boot Descriptor (ECMA 167r3 2/9.4) */ |
| 141 | struct bootDesc { | 141 | struct bootDesc { |
| 142 | uint8_t structType; | 142 | uint8_t structType; |
| 143 | uint8_t stdIdent[VSD_STD_ID_LEN]; | 143 | uint8_t stdIdent[VSD_STD_ID_LEN]; |
| 144 | uint8_t structVersion; | 144 | uint8_t structVersion; |
| 145 | uint8_t reserved1; | 145 | uint8_t reserved1; |
| 146 | regid archType; | 146 | regid archType; |
| 147 | regid bootIdent; | 147 | regid bootIdent; |
| 148 | __le32 bootExtLocation; | 148 | __le32 bootExtLocation; |
| 149 | __le32 bootExtLength; | 149 | __le32 bootExtLength; |
| 150 | __le64 loadAddress; | 150 | __le64 loadAddress; |
| 151 | __le64 startAddress; | 151 | __le64 startAddress; |
| 152 | timestamp descCreationDateAndTime; | 152 | timestamp descCreationDateAndTime; |
| 153 | __le16 flags; | 153 | __le16 flags; |
| 154 | uint8_t reserved2[32]; | 154 | uint8_t reserved2[32]; |
| 155 | uint8_t bootUse[1906]; | 155 | uint8_t bootUse[1906]; |
| 156 | } __attribute__ ((packed)); | 156 | } __attribute__ ((packed)); |
| 157 | 157 | ||
| 158 | /* Flags (ECMA 167r3 2/9.4.12) */ | 158 | /* Flags (ECMA 167r3 2/9.4.12) */ |
| @@ -160,25 +160,25 @@ struct bootDesc { | |||
| 160 | 160 | ||
| 161 | /* Extent Descriptor (ECMA 167r3 3/7.1) */ | 161 | /* Extent Descriptor (ECMA 167r3 3/7.1) */ |
| 162 | typedef struct { | 162 | typedef struct { |
| 163 | __le32 extLength; | 163 | __le32 extLength; |
| 164 | __le32 extLocation; | 164 | __le32 extLocation; |
| 165 | } __attribute__ ((packed)) extent_ad; | 165 | } __attribute__ ((packed)) extent_ad; |
| 166 | 166 | ||
| 167 | typedef struct { | 167 | typedef struct { |
| 168 | uint32_t extLength; | 168 | uint32_t extLength; |
| 169 | uint32_t extLocation; | 169 | uint32_t extLocation; |
| 170 | } kernel_extent_ad; | 170 | } kernel_extent_ad; |
| 171 | 171 | ||
| 172 | /* Descriptor Tag (ECMA 167r3 3/7.2) */ | 172 | /* Descriptor Tag (ECMA 167r3 3/7.2) */ |
| 173 | typedef struct { | 173 | typedef struct { |
| 174 | __le16 tagIdent; | 174 | __le16 tagIdent; |
| 175 | __le16 descVersion; | 175 | __le16 descVersion; |
| 176 | uint8_t tagChecksum; | 176 | uint8_t tagChecksum; |
| 177 | uint8_t reserved; | 177 | uint8_t reserved; |
| 178 | __le16 tagSerialNum; | 178 | __le16 tagSerialNum; |
| 179 | __le16 descCRC; | 179 | __le16 descCRC; |
| 180 | __le16 descCRCLength; | 180 | __le16 descCRCLength; |
| 181 | __le32 tagLocation; | 181 | __le32 tagLocation; |
| 182 | } __attribute__ ((packed)) tag; | 182 | } __attribute__ ((packed)) tag; |
| 183 | 183 | ||
| 184 | /* Tag Identifier (ECMA 167r3 3/7.2.1) */ | 184 | /* Tag Identifier (ECMA 167r3 3/7.2.1) */ |
| @@ -194,37 +194,37 @@ typedef struct { | |||
| 194 | 194 | ||
| 195 | /* NSR Descriptor (ECMA 167r3 3/9.1) */ | 195 | /* NSR Descriptor (ECMA 167r3 3/9.1) */ |
| 196 | struct NSRDesc { | 196 | struct NSRDesc { |
| 197 | uint8_t structType; | 197 | uint8_t structType; |
| 198 | uint8_t stdIdent[VSD_STD_ID_LEN]; | 198 | uint8_t stdIdent[VSD_STD_ID_LEN]; |
| 199 | uint8_t structVersion; | 199 | uint8_t structVersion; |
| 200 | uint8_t reserved; | 200 | uint8_t reserved; |
| 201 | uint8_t structData[2040]; | 201 | uint8_t structData[2040]; |
| 202 | } __attribute__ ((packed)); | 202 | } __attribute__ ((packed)); |
| 203 | 203 | ||
| 204 | /* Primary Volume Descriptor (ECMA 167r3 3/10.1) */ | 204 | /* Primary Volume Descriptor (ECMA 167r3 3/10.1) */ |
| 205 | struct primaryVolDesc { | 205 | struct primaryVolDesc { |
| 206 | tag descTag; | 206 | tag descTag; |
| 207 | __le32 volDescSeqNum; | 207 | __le32 volDescSeqNum; |
| 208 | __le32 primaryVolDescNum; | 208 | __le32 primaryVolDescNum; |
| 209 | dstring volIdent[32]; | 209 | dstring volIdent[32]; |
| 210 | __le16 volSeqNum; | 210 | __le16 volSeqNum; |
| 211 | __le16 maxVolSeqNum; | 211 | __le16 maxVolSeqNum; |
| 212 | __le16 interchangeLvl; | 212 | __le16 interchangeLvl; |
| 213 | __le16 maxInterchangeLvl; | 213 | __le16 maxInterchangeLvl; |
| 214 | __le32 charSetList; | 214 | __le32 charSetList; |
| 215 | __le32 maxCharSetList; | 215 | __le32 maxCharSetList; |
| 216 | dstring volSetIdent[128]; | 216 | dstring volSetIdent[128]; |
| 217 | charspec descCharSet; | 217 | charspec descCharSet; |
| 218 | charspec explanatoryCharSet; | 218 | charspec explanatoryCharSet; |
| 219 | extent_ad volAbstract; | 219 | extent_ad volAbstract; |
| 220 | extent_ad volCopyright; | 220 | extent_ad volCopyright; |
| 221 | regid appIdent; | 221 | regid appIdent; |
| 222 | timestamp recordingDateAndTime; | 222 | timestamp recordingDateAndTime; |
| 223 | regid impIdent; | 223 | regid impIdent; |
| 224 | uint8_t impUse[64]; | 224 | uint8_t impUse[64]; |
| 225 | __le32 predecessorVolDescSeqLocation; | 225 | __le32 predecessorVolDescSeqLocation; |
| 226 | __le16 flags; | 226 | __le16 flags; |
| 227 | uint8_t reserved[22]; | 227 | uint8_t reserved[22]; |
| 228 | } __attribute__ ((packed)); | 228 | } __attribute__ ((packed)); |
| 229 | 229 | ||
| 230 | /* Flags (ECMA 167r3 3/10.1.21) */ | 230 | /* Flags (ECMA 167r3 3/10.1.21) */ |
| @@ -232,26 +232,26 @@ struct primaryVolDesc { | |||
| 232 | 232 | ||
| 233 | /* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */ | 233 | /* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */ |
| 234 | struct anchorVolDescPtr { | 234 | struct anchorVolDescPtr { |
| 235 | tag descTag; | 235 | tag descTag; |
| 236 | extent_ad mainVolDescSeqExt; | 236 | extent_ad mainVolDescSeqExt; |
| 237 | extent_ad reserveVolDescSeqExt; | 237 | extent_ad reserveVolDescSeqExt; |
| 238 | uint8_t reserved[480]; | 238 | uint8_t reserved[480]; |
| 239 | } __attribute__ ((packed)); | 239 | } __attribute__ ((packed)); |
| 240 | 240 | ||
| 241 | /* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */ | 241 | /* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */ |
| 242 | struct volDescPtr { | 242 | struct volDescPtr { |
| 243 | tag descTag; | 243 | tag descTag; |
| 244 | __le32 volDescSeqNum; | 244 | __le32 volDescSeqNum; |
| 245 | extent_ad nextVolDescSeqExt; | 245 | extent_ad nextVolDescSeqExt; |
| 246 | uint8_t reserved[484]; | 246 | uint8_t reserved[484]; |
| 247 | } __attribute__ ((packed)); | 247 | } __attribute__ ((packed)); |
| 248 | 248 | ||
| 249 | /* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */ | 249 | /* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */ |
| 250 | struct impUseVolDesc { | 250 | struct impUseVolDesc { |
| 251 | tag descTag; | 251 | tag descTag; |
| 252 | __le32 volDescSeqNum; | 252 | __le32 volDescSeqNum; |
| 253 | regid impIdent; | 253 | regid impIdent; |
| 254 | uint8_t impUse[460]; | 254 | uint8_t impUse[460]; |
| 255 | } __attribute__ ((packed)); | 255 | } __attribute__ ((packed)); |
| 256 | 256 | ||
| 257 | /* Partition Descriptor (ECMA 167r3 3/10.5) */ | 257 | /* Partition Descriptor (ECMA 167r3 3/10.5) */ |
| @@ -291,26 +291,26 @@ struct partitionDesc { | |||
| 291 | 291 | ||
| 292 | /* Logical Volume Descriptor (ECMA 167r3 3/10.6) */ | 292 | /* Logical Volume Descriptor (ECMA 167r3 3/10.6) */ |
| 293 | struct logicalVolDesc { | 293 | struct logicalVolDesc { |
| 294 | tag descTag; | 294 | tag descTag; |
| 295 | __le32 volDescSeqNum; | 295 | __le32 volDescSeqNum; |
| 296 | charspec descCharSet; | 296 | charspec descCharSet; |
| 297 | dstring logicalVolIdent[128]; | 297 | dstring logicalVolIdent[128]; |
| 298 | __le32 logicalBlockSize; | 298 | __le32 logicalBlockSize; |
| 299 | regid domainIdent; | 299 | regid domainIdent; |
| 300 | uint8_t logicalVolContentsUse[16]; | 300 | uint8_t logicalVolContentsUse[16]; |
| 301 | __le32 mapTableLength; | 301 | __le32 mapTableLength; |
| 302 | __le32 numPartitionMaps; | 302 | __le32 numPartitionMaps; |
| 303 | regid impIdent; | 303 | regid impIdent; |
| 304 | uint8_t impUse[128]; | 304 | uint8_t impUse[128]; |
| 305 | extent_ad integritySeqExt; | 305 | extent_ad integritySeqExt; |
| 306 | uint8_t partitionMaps[0]; | 306 | uint8_t partitionMaps[0]; |
| 307 | } __attribute__ ((packed)); | 307 | } __attribute__ ((packed)); |
| 308 | 308 | ||
| 309 | /* Generic Partition Map (ECMA 167r3 3/10.7.1) */ | 309 | /* Generic Partition Map (ECMA 167r3 3/10.7.1) */ |
| 310 | struct genericPartitionMap { | 310 | struct genericPartitionMap { |
| 311 | uint8_t partitionMapType; | 311 | uint8_t partitionMapType; |
| 312 | uint8_t partitionMapLength; | 312 | uint8_t partitionMapLength; |
| 313 | uint8_t partitionMapping[0]; | 313 | uint8_t partitionMapping[0]; |
| 314 | } __attribute__ ((packed)); | 314 | } __attribute__ ((packed)); |
| 315 | 315 | ||
| 316 | /* Partition Map Type (ECMA 167r3 3/10.7.1.1) */ | 316 | /* Partition Map Type (ECMA 167r3 3/10.7.1.1) */ |
| @@ -320,45 +320,45 @@ struct genericPartitionMap { | |||
| 320 | 320 | ||
| 321 | /* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */ | 321 | /* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */ |
| 322 | struct genericPartitionMap1 { | 322 | struct genericPartitionMap1 { |
| 323 | uint8_t partitionMapType; | 323 | uint8_t partitionMapType; |
| 324 | uint8_t partitionMapLength; | 324 | uint8_t partitionMapLength; |
| 325 | __le16 volSeqNum; | 325 | __le16 volSeqNum; |
| 326 | __le16 partitionNum; | 326 | __le16 partitionNum; |
| 327 | } __attribute__ ((packed)); | 327 | } __attribute__ ((packed)); |
| 328 | 328 | ||
| 329 | /* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */ | 329 | /* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */ |
| 330 | struct genericPartitionMap2 { | 330 | struct genericPartitionMap2 { |
| 331 | uint8_t partitionMapType; | 331 | uint8_t partitionMapType; |
| 332 | uint8_t partitionMapLength; | 332 | uint8_t partitionMapLength; |
| 333 | uint8_t partitionIdent[62]; | 333 | uint8_t partitionIdent[62]; |
| 334 | } __attribute__ ((packed)); | 334 | } __attribute__ ((packed)); |
| 335 | 335 | ||
| 336 | /* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */ | 336 | /* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */ |
| 337 | struct unallocSpaceDesc { | 337 | struct unallocSpaceDesc { |
| 338 | tag descTag; | 338 | tag descTag; |
| 339 | __le32 volDescSeqNum; | 339 | __le32 volDescSeqNum; |
| 340 | __le32 numAllocDescs; | 340 | __le32 numAllocDescs; |
| 341 | extent_ad allocDescs[0]; | 341 | extent_ad allocDescs[0]; |
| 342 | } __attribute__ ((packed)); | 342 | } __attribute__ ((packed)); |
| 343 | 343 | ||
| 344 | /* Terminating Descriptor (ECMA 167r3 3/10.9) */ | 344 | /* Terminating Descriptor (ECMA 167r3 3/10.9) */ |
| 345 | struct terminatingDesc { | 345 | struct terminatingDesc { |
| 346 | tag descTag; | 346 | tag descTag; |
| 347 | uint8_t reserved[496]; | 347 | uint8_t reserved[496]; |
| 348 | } __attribute__ ((packed)); | 348 | } __attribute__ ((packed)); |
| 349 | 349 | ||
| 350 | /* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */ | 350 | /* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */ |
| 351 | struct logicalVolIntegrityDesc { | 351 | struct logicalVolIntegrityDesc { |
| 352 | tag descTag; | 352 | tag descTag; |
| 353 | timestamp recordingDateAndTime; | 353 | timestamp recordingDateAndTime; |
| 354 | __le32 integrityType; | 354 | __le32 integrityType; |
| 355 | extent_ad nextIntegrityExt; | 355 | extent_ad nextIntegrityExt; |
| 356 | uint8_t logicalVolContentsUse[32]; | 356 | uint8_t logicalVolContentsUse[32]; |
| 357 | __le32 numOfPartitions; | 357 | __le32 numOfPartitions; |
| 358 | __le32 lengthOfImpUse; | 358 | __le32 lengthOfImpUse; |
| 359 | __le32 freeSpaceTable[0]; | 359 | __le32 freeSpaceTable[0]; |
| 360 | __le32 sizeTable[0]; | 360 | __le32 sizeTable[0]; |
| 361 | uint8_t impUse[0]; | 361 | uint8_t impUse[0]; |
| 362 | } __attribute__ ((packed)); | 362 | } __attribute__ ((packed)); |
| 363 | 363 | ||
| 364 | /* Integrity Type (ECMA 167r3 3/10.10.3) */ | 364 | /* Integrity Type (ECMA 167r3 3/10.10.3) */ |
| @@ -367,48 +367,48 @@ struct logicalVolIntegrityDesc { | |||
| 367 | 367 | ||
| 368 | /* Recorded Address (ECMA 167r3 4/7.1) */ | 368 | /* Recorded Address (ECMA 167r3 4/7.1) */ |
| 369 | typedef struct { | 369 | typedef struct { |
| 370 | __le32 logicalBlockNum; | 370 | __le32 logicalBlockNum; |
| 371 | __le16 partitionReferenceNum; | 371 | __le16 partitionReferenceNum; |
| 372 | } __attribute__ ((packed)) lb_addr; | 372 | } __attribute__ ((packed)) lb_addr; |
| 373 | 373 | ||
| 374 | /* ... and its in-core analog */ | 374 | /* ... and its in-core analog */ |
| 375 | typedef struct { | 375 | typedef struct { |
| 376 | uint32_t logicalBlockNum; | 376 | uint32_t logicalBlockNum; |
| 377 | uint16_t partitionReferenceNum; | 377 | uint16_t partitionReferenceNum; |
| 378 | } kernel_lb_addr; | 378 | } kernel_lb_addr; |
| 379 | 379 | ||
| 380 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ | 380 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ |
| 381 | typedef struct { | 381 | typedef struct { |
| 382 | __le32 extLength; | 382 | __le32 extLength; |
| 383 | __le32 extPosition; | 383 | __le32 extPosition; |
| 384 | } __attribute__ ((packed)) short_ad; | 384 | } __attribute__ ((packed)) short_ad; |
| 385 | 385 | ||
| 386 | /* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */ | 386 | /* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */ |
| 387 | typedef struct { | 387 | typedef struct { |
| 388 | __le32 extLength; | 388 | __le32 extLength; |
| 389 | lb_addr extLocation; | 389 | lb_addr extLocation; |
| 390 | uint8_t impUse[6]; | 390 | uint8_t impUse[6]; |
| 391 | } __attribute__ ((packed)) long_ad; | 391 | } __attribute__ ((packed)) long_ad; |
| 392 | 392 | ||
| 393 | typedef struct { | 393 | typedef struct { |
| 394 | uint32_t extLength; | 394 | uint32_t extLength; |
| 395 | kernel_lb_addr extLocation; | 395 | kernel_lb_addr extLocation; |
| 396 | uint8_t impUse[6]; | 396 | uint8_t impUse[6]; |
| 397 | } kernel_long_ad; | 397 | } kernel_long_ad; |
| 398 | 398 | ||
| 399 | /* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */ | 399 | /* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */ |
| 400 | typedef struct { | 400 | typedef struct { |
| 401 | __le32 extLength; | 401 | __le32 extLength; |
| 402 | __le32 recordedLength; | 402 | __le32 recordedLength; |
| 403 | __le32 informationLength; | 403 | __le32 informationLength; |
| 404 | lb_addr extLocation; | 404 | lb_addr extLocation; |
| 405 | } __attribute__ ((packed)) ext_ad; | 405 | } __attribute__ ((packed)) ext_ad; |
| 406 | 406 | ||
| 407 | typedef struct { | 407 | typedef struct { |
| 408 | uint32_t extLength; | 408 | uint32_t extLength; |
| 409 | uint32_t recordedLength; | 409 | uint32_t recordedLength; |
| 410 | uint32_t informationLength; | 410 | uint32_t informationLength; |
| 411 | kernel_lb_addr extLocation; | 411 | kernel_lb_addr extLocation; |
| 412 | } kernel_ext_ad; | 412 | } kernel_ext_ad; |
| 413 | 413 | ||
| 414 | /* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */ | 414 | /* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */ |
| @@ -428,48 +428,48 @@ typedef struct { | |||
| 428 | 428 | ||
| 429 | /* File Set Descriptor (ECMA 167r3 4/14.1) */ | 429 | /* File Set Descriptor (ECMA 167r3 4/14.1) */ |
| 430 | struct fileSetDesc { | 430 | struct fileSetDesc { |
| 431 | tag descTag; | 431 | tag descTag; |
| 432 | timestamp recordingDateAndTime; | 432 | timestamp recordingDateAndTime; |
| 433 | __le16 interchangeLvl; | 433 | __le16 interchangeLvl; |
| 434 | __le16 maxInterchangeLvl; | 434 | __le16 maxInterchangeLvl; |
| 435 | __le32 charSetList; | 435 | __le32 charSetList; |
| 436 | __le32 maxCharSetList; | 436 | __le32 maxCharSetList; |
| 437 | __le32 fileSetNum; | 437 | __le32 fileSetNum; |
| 438 | __le32 fileSetDescNum; | 438 | __le32 fileSetDescNum; |
| 439 | charspec logicalVolIdentCharSet; | 439 | charspec logicalVolIdentCharSet; |
| 440 | dstring logicalVolIdent[128]; | 440 | dstring logicalVolIdent[128]; |
| 441 | charspec fileSetCharSet; | 441 | charspec fileSetCharSet; |
| 442 | dstring fileSetIdent[32]; | 442 | dstring fileSetIdent[32]; |
| 443 | dstring copyrightFileIdent[32]; | 443 | dstring copyrightFileIdent[32]; |
| 444 | dstring abstractFileIdent[32]; | 444 | dstring abstractFileIdent[32]; |
| 445 | long_ad rootDirectoryICB; | 445 | long_ad rootDirectoryICB; |
| 446 | regid domainIdent; | 446 | regid domainIdent; |
| 447 | long_ad nextExt; | 447 | long_ad nextExt; |
| 448 | long_ad streamDirectoryICB; | 448 | long_ad streamDirectoryICB; |
| 449 | uint8_t reserved[32]; | 449 | uint8_t reserved[32]; |
| 450 | } __attribute__ ((packed)); | 450 | } __attribute__ ((packed)); |
| 451 | 451 | ||
| 452 | /* Partition Header Descriptor (ECMA 167r3 4/14.3) */ | 452 | /* Partition Header Descriptor (ECMA 167r3 4/14.3) */ |
| 453 | struct partitionHeaderDesc { | 453 | struct partitionHeaderDesc { |
| 454 | short_ad unallocSpaceTable; | 454 | short_ad unallocSpaceTable; |
| 455 | short_ad unallocSpaceBitmap; | 455 | short_ad unallocSpaceBitmap; |
| 456 | short_ad partitionIntegrityTable; | 456 | short_ad partitionIntegrityTable; |
| 457 | short_ad freedSpaceTable; | 457 | short_ad freedSpaceTable; |
| 458 | short_ad freedSpaceBitmap; | 458 | short_ad freedSpaceBitmap; |
| 459 | uint8_t reserved[88]; | 459 | uint8_t reserved[88]; |
| 460 | } __attribute__ ((packed)); | 460 | } __attribute__ ((packed)); |
| 461 | 461 | ||
| 462 | /* File Identifier Descriptor (ECMA 167r3 4/14.4) */ | 462 | /* File Identifier Descriptor (ECMA 167r3 4/14.4) */ |
| 463 | struct fileIdentDesc { | 463 | struct fileIdentDesc { |
| 464 | tag descTag; | 464 | tag descTag; |
| 465 | __le16 fileVersionNum; | 465 | __le16 fileVersionNum; |
| 466 | uint8_t fileCharacteristics; | 466 | uint8_t fileCharacteristics; |
| 467 | uint8_t lengthFileIdent; | 467 | uint8_t lengthFileIdent; |
| 468 | long_ad icb; | 468 | long_ad icb; |
| 469 | __le16 lengthOfImpUse; | 469 | __le16 lengthOfImpUse; |
| 470 | uint8_t impUse[0]; | 470 | uint8_t impUse[0]; |
| 471 | uint8_t fileIdent[0]; | 471 | uint8_t fileIdent[0]; |
| 472 | uint8_t padding[0]; | 472 | uint8_t padding[0]; |
| 473 | } __attribute__ ((packed)); | 473 | } __attribute__ ((packed)); |
| 474 | 474 | ||
| 475 | /* File Characteristics (ECMA 167r3 4/14.4.3) */ | 475 | /* File Characteristics (ECMA 167r3 4/14.4.3) */ |
| @@ -481,21 +481,21 @@ struct fileIdentDesc { | |||
| 481 | 481 | ||
| 482 | /* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */ | 482 | /* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */ |
| 483 | struct allocExtDesc { | 483 | struct allocExtDesc { |
| 484 | tag descTag; | 484 | tag descTag; |
| 485 | __le32 previousAllocExtLocation; | 485 | __le32 previousAllocExtLocation; |
| 486 | __le32 lengthAllocDescs; | 486 | __le32 lengthAllocDescs; |
| 487 | } __attribute__ ((packed)); | 487 | } __attribute__ ((packed)); |
| 488 | 488 | ||
| 489 | /* ICB Tag (ECMA 167r3 4/14.6) */ | 489 | /* ICB Tag (ECMA 167r3 4/14.6) */ |
| 490 | typedef struct { | 490 | typedef struct { |
| 491 | __le32 priorRecordedNumDirectEntries; | 491 | __le32 priorRecordedNumDirectEntries; |
| 492 | __le16 strategyType; | 492 | __le16 strategyType; |
| 493 | __le16 strategyParameter; | 493 | __le16 strategyParameter; |
| 494 | __le16 numEntries; | 494 | __le16 numEntries; |
| 495 | uint8_t reserved; | 495 | uint8_t reserved; |
| 496 | uint8_t fileType; | 496 | uint8_t fileType; |
| 497 | lb_addr parentICBLocation; | 497 | lb_addr parentICBLocation; |
| 498 | __le16 flags; | 498 | __le16 flags; |
| 499 | } __attribute__ ((packed)) icbtag; | 499 | } __attribute__ ((packed)) icbtag; |
| 500 | 500 | ||
| 501 | /* Strategy Type (ECMA 167r3 4/14.6.2) */ | 501 | /* Strategy Type (ECMA 167r3 4/14.6.2) */ |
| @@ -541,41 +541,41 @@ typedef struct { | |||
| 541 | 541 | ||
| 542 | /* Indirect Entry (ECMA 167r3 4/14.7) */ | 542 | /* Indirect Entry (ECMA 167r3 4/14.7) */ |
| 543 | struct indirectEntry { | 543 | struct indirectEntry { |
| 544 | tag descTag; | 544 | tag descTag; |
| 545 | icbtag icbTag; | 545 | icbtag icbTag; |
| 546 | long_ad indirectICB; | 546 | long_ad indirectICB; |
| 547 | } __attribute__ ((packed)); | 547 | } __attribute__ ((packed)); |
| 548 | 548 | ||
| 549 | /* Terminal Entry (ECMA 167r3 4/14.8) */ | 549 | /* Terminal Entry (ECMA 167r3 4/14.8) */ |
| 550 | struct terminalEntry { | 550 | struct terminalEntry { |
| 551 | tag descTag; | 551 | tag descTag; |
| 552 | icbtag icbTag; | 552 | icbtag icbTag; |
| 553 | } __attribute__ ((packed)); | 553 | } __attribute__ ((packed)); |
| 554 | 554 | ||
| 555 | /* File Entry (ECMA 167r3 4/14.9) */ | 555 | /* File Entry (ECMA 167r3 4/14.9) */ |
| 556 | struct fileEntry { | 556 | struct fileEntry { |
| 557 | tag descTag; | 557 | tag descTag; |
| 558 | icbtag icbTag; | 558 | icbtag icbTag; |
| 559 | __le32 uid; | 559 | __le32 uid; |
| 560 | __le32 gid; | 560 | __le32 gid; |
| 561 | __le32 permissions; | 561 | __le32 permissions; |
| 562 | __le16 fileLinkCount; | 562 | __le16 fileLinkCount; |
| 563 | uint8_t recordFormat; | 563 | uint8_t recordFormat; |
| 564 | uint8_t recordDisplayAttr; | 564 | uint8_t recordDisplayAttr; |
| 565 | __le32 recordLength; | 565 | __le32 recordLength; |
| 566 | __le64 informationLength; | 566 | __le64 informationLength; |
| 567 | __le64 logicalBlocksRecorded; | 567 | __le64 logicalBlocksRecorded; |
| 568 | timestamp accessTime; | 568 | timestamp accessTime; |
| 569 | timestamp modificationTime; | 569 | timestamp modificationTime; |
| 570 | timestamp attrTime; | 570 | timestamp attrTime; |
| 571 | __le32 checkpoint; | 571 | __le32 checkpoint; |
| 572 | long_ad extendedAttrICB; | 572 | long_ad extendedAttrICB; |
| 573 | regid impIdent; | 573 | regid impIdent; |
| 574 | __le64 uniqueID; | 574 | __le64 uniqueID; |
| 575 | __le32 lengthExtendedAttr; | 575 | __le32 lengthExtendedAttr; |
| 576 | __le32 lengthAllocDescs; | 576 | __le32 lengthAllocDescs; |
| 577 | uint8_t extendedAttr[0]; | 577 | uint8_t extendedAttr[0]; |
| 578 | uint8_t allocDescs[0]; | 578 | uint8_t allocDescs[0]; |
| 579 | } __attribute__ ((packed)); | 579 | } __attribute__ ((packed)); |
| 580 | 580 | ||
| 581 | /* Permissions (ECMA 167r3 4/14.9.5) */ | 581 | /* Permissions (ECMA 167r3 4/14.9.5) */ |
| @@ -617,51 +617,51 @@ struct fileEntry { | |||
| 617 | 617 | ||
| 618 | /* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */ | 618 | /* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */ |
| 619 | struct extendedAttrHeaderDesc { | 619 | struct extendedAttrHeaderDesc { |
| 620 | tag descTag; | 620 | tag descTag; |
| 621 | __le32 impAttrLocation; | 621 | __le32 impAttrLocation; |
| 622 | __le32 appAttrLocation; | 622 | __le32 appAttrLocation; |
| 623 | } __attribute__ ((packed)); | 623 | } __attribute__ ((packed)); |
| 624 | 624 | ||
| 625 | /* Generic Format (ECMA 167r3 4/14.10.2) */ | 625 | /* Generic Format (ECMA 167r3 4/14.10.2) */ |
| 626 | struct genericFormat { | 626 | struct genericFormat { |
| 627 | __le32 attrType; | 627 | __le32 attrType; |
| 628 | uint8_t attrSubtype; | 628 | uint8_t attrSubtype; |
| 629 | uint8_t reserved[3]; | 629 | uint8_t reserved[3]; |
| 630 | __le32 attrLength; | 630 | __le32 attrLength; |
| 631 | uint8_t attrData[0]; | 631 | uint8_t attrData[0]; |
| 632 | } __attribute__ ((packed)); | 632 | } __attribute__ ((packed)); |
| 633 | 633 | ||
| 634 | /* Character Set Information (ECMA 167r3 4/14.10.3) */ | 634 | /* Character Set Information (ECMA 167r3 4/14.10.3) */ |
| 635 | struct charSetInfo { | 635 | struct charSetInfo { |
| 636 | __le32 attrType; | 636 | __le32 attrType; |
| 637 | uint8_t attrSubtype; | 637 | uint8_t attrSubtype; |
| 638 | uint8_t reserved[3]; | 638 | uint8_t reserved[3]; |
| 639 | __le32 attrLength; | 639 | __le32 attrLength; |
| 640 | __le32 escapeSeqLength; | 640 | __le32 escapeSeqLength; |
| 641 | uint8_t charSetType; | 641 | uint8_t charSetType; |
| 642 | uint8_t escapeSeq[0]; | 642 | uint8_t escapeSeq[0]; |
| 643 | } __attribute__ ((packed)); | 643 | } __attribute__ ((packed)); |
| 644 | 644 | ||
| 645 | /* Alternate Permissions (ECMA 167r3 4/14.10.4) */ | 645 | /* Alternate Permissions (ECMA 167r3 4/14.10.4) */ |
| 646 | struct altPerms { | 646 | struct altPerms { |
| 647 | __le32 attrType; | 647 | __le32 attrType; |
| 648 | uint8_t attrSubtype; | 648 | uint8_t attrSubtype; |
| 649 | uint8_t reserved[3]; | 649 | uint8_t reserved[3]; |
| 650 | __le32 attrLength; | 650 | __le32 attrLength; |
| 651 | __le16 ownerIdent; | 651 | __le16 ownerIdent; |
| 652 | __le16 groupIdent; | 652 | __le16 groupIdent; |
| 653 | __le16 permission; | 653 | __le16 permission; |
| 654 | } __attribute__ ((packed)); | 654 | } __attribute__ ((packed)); |
| 655 | 655 | ||
| 656 | /* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */ | 656 | /* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */ |
| 657 | struct fileTimesExtAttr { | 657 | struct fileTimesExtAttr { |
| 658 | __le32 attrType; | 658 | __le32 attrType; |
| 659 | uint8_t attrSubtype; | 659 | uint8_t attrSubtype; |
| 660 | uint8_t reserved[3]; | 660 | uint8_t reserved[3]; |
| 661 | __le32 attrLength; | 661 | __le32 attrLength; |
| 662 | __le32 dataLength; | 662 | __le32 dataLength; |
| 663 | __le32 fileTimeExistence; | 663 | __le32 fileTimeExistence; |
| 664 | uint8_t fileTimes; | 664 | uint8_t fileTimes; |
| 665 | } __attribute__ ((packed)); | 665 | } __attribute__ ((packed)); |
| 666 | 666 | ||
| 667 | /* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */ | 667 | /* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */ |
| @@ -672,47 +672,47 @@ struct fileTimesExtAttr { | |||
| 672 | 672 | ||
| 673 | /* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */ | 673 | /* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */ |
| 674 | struct infoTimesExtAttr { | 674 | struct infoTimesExtAttr { |
| 675 | __le32 attrType; | 675 | __le32 attrType; |
| 676 | uint8_t attrSubtype; | 676 | uint8_t attrSubtype; |
| 677 | uint8_t reserved[3]; | 677 | uint8_t reserved[3]; |
| 678 | __le32 attrLength; | 678 | __le32 attrLength; |
| 679 | __le32 dataLength; | 679 | __le32 dataLength; |
| 680 | __le32 infoTimeExistence; | 680 | __le32 infoTimeExistence; |
| 681 | uint8_t infoTimes[0]; | 681 | uint8_t infoTimes[0]; |
| 682 | } __attribute__ ((packed)); | 682 | } __attribute__ ((packed)); |
| 683 | 683 | ||
| 684 | /* Device Specification (ECMA 167r3 4/14.10.7) */ | 684 | /* Device Specification (ECMA 167r3 4/14.10.7) */ |
| 685 | struct deviceSpec { | 685 | struct deviceSpec { |
| 686 | __le32 attrType; | 686 | __le32 attrType; |
| 687 | uint8_t attrSubtype; | 687 | uint8_t attrSubtype; |
| 688 | uint8_t reserved[3]; | 688 | uint8_t reserved[3]; |
| 689 | __le32 attrLength; | 689 | __le32 attrLength; |
| 690 | __le32 impUseLength; | 690 | __le32 impUseLength; |
| 691 | __le32 majorDeviceIdent; | 691 | __le32 majorDeviceIdent; |
| 692 | __le32 minorDeviceIdent; | 692 | __le32 minorDeviceIdent; |
| 693 | uint8_t impUse[0]; | 693 | uint8_t impUse[0]; |
| 694 | } __attribute__ ((packed)); | 694 | } __attribute__ ((packed)); |
| 695 | 695 | ||
| 696 | /* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */ | 696 | /* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */ |
| 697 | struct impUseExtAttr { | 697 | struct impUseExtAttr { |
| 698 | __le32 attrType; | 698 | __le32 attrType; |
| 699 | uint8_t attrSubtype; | 699 | uint8_t attrSubtype; |
| 700 | uint8_t reserved[3]; | 700 | uint8_t reserved[3]; |
| 701 | __le32 attrLength; | 701 | __le32 attrLength; |
| 702 | __le32 impUseLength; | 702 | __le32 impUseLength; |
| 703 | regid impIdent; | 703 | regid impIdent; |
| 704 | uint8_t impUse[0]; | 704 | uint8_t impUse[0]; |
| 705 | } __attribute__ ((packed)); | 705 | } __attribute__ ((packed)); |
| 706 | 706 | ||
| 707 | /* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */ | 707 | /* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */ |
| 708 | struct appUseExtAttr { | 708 | struct appUseExtAttr { |
| 709 | __le32 attrType; | 709 | __le32 attrType; |
| 710 | uint8_t attrSubtype; | 710 | uint8_t attrSubtype; |
| 711 | uint8_t reserved[3]; | 711 | uint8_t reserved[3]; |
| 712 | __le32 attrLength; | 712 | __le32 attrLength; |
| 713 | __le32 appUseLength; | 713 | __le32 appUseLength; |
| 714 | regid appIdent; | 714 | regid appIdent; |
| 715 | uint8_t appUse[0]; | 715 | uint8_t appUse[0]; |
| 716 | } __attribute__ ((packed)); | 716 | } __attribute__ ((packed)); |
| 717 | 717 | ||
| 718 | #define EXTATTR_CHAR_SET 1 | 718 | #define EXTATTR_CHAR_SET 1 |
| @@ -725,29 +725,29 @@ struct appUseExtAttr { | |||
| 725 | 725 | ||
| 726 | /* Unallocated Space Entry (ECMA 167r3 4/14.11) */ | 726 | /* Unallocated Space Entry (ECMA 167r3 4/14.11) */ |
| 727 | struct unallocSpaceEntry { | 727 | struct unallocSpaceEntry { |
| 728 | tag descTag; | 728 | tag descTag; |
| 729 | icbtag icbTag; | 729 | icbtag icbTag; |
| 730 | __le32 lengthAllocDescs; | 730 | __le32 lengthAllocDescs; |
| 731 | uint8_t allocDescs[0]; | 731 | uint8_t allocDescs[0]; |
| 732 | } __attribute__ ((packed)); | 732 | } __attribute__ ((packed)); |
| 733 | 733 | ||
| 734 | /* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */ | 734 | /* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */ |
| 735 | struct spaceBitmapDesc { | 735 | struct spaceBitmapDesc { |
| 736 | tag descTag; | 736 | tag descTag; |
| 737 | __le32 numOfBits; | 737 | __le32 numOfBits; |
| 738 | __le32 numOfBytes; | 738 | __le32 numOfBytes; |
| 739 | uint8_t bitmap[0]; | 739 | uint8_t bitmap[0]; |
| 740 | } __attribute__ ((packed)); | 740 | } __attribute__ ((packed)); |
| 741 | 741 | ||
| 742 | /* Partition Integrity Entry (ECMA 167r3 4/14.13) */ | 742 | /* Partition Integrity Entry (ECMA 167r3 4/14.13) */ |
| 743 | struct partitionIntegrityEntry { | 743 | struct partitionIntegrityEntry { |
| 744 | tag descTag; | 744 | tag descTag; |
| 745 | icbtag icbTag; | 745 | icbtag icbTag; |
| 746 | timestamp recordingDateAndTime; | 746 | timestamp recordingDateAndTime; |
| 747 | uint8_t integrityType; | 747 | uint8_t integrityType; |
| 748 | uint8_t reserved[175]; | 748 | uint8_t reserved[175]; |
| 749 | regid impIdent; | 749 | regid impIdent; |
| 750 | uint8_t impUse[256]; | 750 | uint8_t impUse[256]; |
| 751 | } __attribute__ ((packed)); | 751 | } __attribute__ ((packed)); |
| 752 | 752 | ||
| 753 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ | 753 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ |
| @@ -764,46 +764,46 @@ struct partitionIntegrityEntry { | |||
| 764 | 764 | ||
| 765 | /* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */ | 765 | /* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */ |
| 766 | struct logicalVolHeaderDesc { | 766 | struct logicalVolHeaderDesc { |
| 767 | __le64 uniqueID; | 767 | __le64 uniqueID; |
| 768 | uint8_t reserved[24]; | 768 | uint8_t reserved[24]; |
| 769 | } __attribute__ ((packed)); | 769 | } __attribute__ ((packed)); |
| 770 | 770 | ||
| 771 | /* Path Component (ECMA 167r3 4/14.16.1) */ | 771 | /* Path Component (ECMA 167r3 4/14.16.1) */ |
| 772 | struct pathComponent { | 772 | struct pathComponent { |
| 773 | uint8_t componentType; | 773 | uint8_t componentType; |
| 774 | uint8_t lengthComponentIdent; | 774 | uint8_t lengthComponentIdent; |
| 775 | __le16 componentFileVersionNum; | 775 | __le16 componentFileVersionNum; |
| 776 | dstring componentIdent[0]; | 776 | dstring componentIdent[0]; |
| 777 | } __attribute__ ((packed)); | 777 | } __attribute__ ((packed)); |
| 778 | 778 | ||
| 779 | /* File Entry (ECMA 167r3 4/14.17) */ | 779 | /* File Entry (ECMA 167r3 4/14.17) */ |
| 780 | struct extendedFileEntry { | 780 | struct extendedFileEntry { |
| 781 | tag descTag; | 781 | tag descTag; |
| 782 | icbtag icbTag; | 782 | icbtag icbTag; |
| 783 | __le32 uid; | 783 | __le32 uid; |
| 784 | __le32 gid; | 784 | __le32 gid; |
| 785 | __le32 permissions; | 785 | __le32 permissions; |
| 786 | __le16 fileLinkCount; | 786 | __le16 fileLinkCount; |
| 787 | uint8_t recordFormat; | 787 | uint8_t recordFormat; |
| 788 | uint8_t recordDisplayAttr; | 788 | uint8_t recordDisplayAttr; |
| 789 | __le32 recordLength; | 789 | __le32 recordLength; |
| 790 | __le64 informationLength; | 790 | __le64 informationLength; |
| 791 | __le64 objectSize; | 791 | __le64 objectSize; |
| 792 | __le64 logicalBlocksRecorded; | 792 | __le64 logicalBlocksRecorded; |
| 793 | timestamp accessTime; | 793 | timestamp accessTime; |
| 794 | timestamp modificationTime; | 794 | timestamp modificationTime; |
| 795 | timestamp createTime; | 795 | timestamp createTime; |
| 796 | timestamp attrTime; | 796 | timestamp attrTime; |
| 797 | __le32 checkpoint; | 797 | __le32 checkpoint; |
| 798 | __le32 reserved; | 798 | __le32 reserved; |
| 799 | long_ad extendedAttrICB; | 799 | long_ad extendedAttrICB; |
| 800 | long_ad streamDirectoryICB; | 800 | long_ad streamDirectoryICB; |
| 801 | regid impIdent; | 801 | regid impIdent; |
| 802 | __le64 uniqueID; | 802 | __le64 uniqueID; |
| 803 | __le32 lengthExtendedAttr; | 803 | __le32 lengthExtendedAttr; |
| 804 | __le32 lengthAllocDescs; | 804 | __le32 lengthAllocDescs; |
| 805 | uint8_t extendedAttr[0]; | 805 | uint8_t extendedAttr[0]; |
| 806 | uint8_t allocDescs[0]; | 806 | uint8_t allocDescs[0]; |
| 807 | } __attribute__ ((packed)); | 807 | } __attribute__ ((packed)); |
| 808 | 808 | ||
| 809 | #endif /* _ECMA_167_H */ | 809 | #endif /* _ECMA_167_H */ |
diff --git a/fs/udf/file.c b/fs/udf/file.c index 67bf36bd3e6e..5d7a4ea27753 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | #include <linux/udf_fs.h> | 30 | #include <linux/udf_fs.h> |
| 31 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
| 32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
| 33 | #include <linux/string.h> /* memset */ | 33 | #include <linux/string.h> /* memset */ |
| 34 | #include <linux/capability.h> | 34 | #include <linux/capability.h> |
| 35 | #include <linux/errno.h> | 35 | #include <linux/errno.h> |
| 36 | #include <linux/smp_lock.h> | 36 | #include <linux/smp_lock.h> |
| @@ -55,11 +55,11 @@ static int udf_adinicb_readpage(struct file *file, struct page *page) | |||
| 55 | SetPageUptodate(page); | 55 | SetPageUptodate(page); |
| 56 | kunmap(page); | 56 | kunmap(page); |
| 57 | unlock_page(page); | 57 | unlock_page(page); |
| 58 | |||
| 58 | return 0; | 59 | return 0; |
| 59 | } | 60 | } |
| 60 | 61 | ||
| 61 | static int udf_adinicb_writepage(struct page *page, | 62 | static int udf_adinicb_writepage(struct page *page, struct writeback_control *wbc) |
| 62 | struct writeback_control *wbc) | ||
| 63 | { | 63 | { |
| 64 | struct inode *inode = page->mapping->host; | 64 | struct inode *inode = page->mapping->host; |
| 65 | char *kaddr; | 65 | char *kaddr; |
| @@ -72,6 +72,7 @@ static int udf_adinicb_writepage(struct page *page, | |||
| 72 | SetPageUptodate(page); | 72 | SetPageUptodate(page); |
| 73 | kunmap(page); | 73 | kunmap(page); |
| 74 | unlock_page(page); | 74 | unlock_page(page); |
| 75 | |||
| 75 | return 0; | 76 | return 0; |
| 76 | } | 77 | } |
| 77 | 78 | ||
| @@ -100,11 +101,11 @@ static int udf_adinicb_commit_write(struct file *file, struct page *page, | |||
| 100 | } | 101 | } |
| 101 | 102 | ||
| 102 | const struct address_space_operations udf_adinicb_aops = { | 103 | const struct address_space_operations udf_adinicb_aops = { |
| 103 | .readpage = udf_adinicb_readpage, | 104 | .readpage = udf_adinicb_readpage, |
| 104 | .writepage = udf_adinicb_writepage, | 105 | .writepage = udf_adinicb_writepage, |
| 105 | .sync_page = block_sync_page, | 106 | .sync_page = block_sync_page, |
| 106 | .prepare_write = udf_adinicb_prepare_write, | 107 | .prepare_write = udf_adinicb_prepare_write, |
| 107 | .commit_write = udf_adinicb_commit_write, | 108 | .commit_write = udf_adinicb_commit_write, |
| 108 | }; | 109 | }; |
| 109 | 110 | ||
| 110 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | 111 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, |
| @@ -122,8 +123,8 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 122 | else | 123 | else |
| 123 | pos = ppos; | 124 | pos = ppos; |
| 124 | 125 | ||
| 125 | if (inode->i_sb->s_blocksize < | 126 | if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + |
| 126 | (udf_file_entry_alloc_offset(inode) + pos + count)) { | 127 | pos + count)) { |
| 127 | udf_expand_file_adinicb(inode, pos + count, &err); | 128 | udf_expand_file_adinicb(inode, pos + count, &err); |
| 128 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) { | 129 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) { |
| 129 | udf_debug("udf_expand_adinicb: err=%d\n", err); | 130 | udf_debug("udf_expand_adinicb: err=%d\n", err); |
| @@ -138,9 +139,9 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 138 | } | 139 | } |
| 139 | 140 | ||
| 140 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); | 141 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); |
| 141 | |||
| 142 | if (retval > 0) | 142 | if (retval > 0) |
| 143 | mark_inode_dirty(inode); | 143 | mark_inode_dirty(inode); |
| 144 | |||
| 144 | return retval; | 145 | return retval; |
| 145 | } | 146 | } |
| 146 | 147 | ||
| @@ -181,10 +182,12 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 181 | int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | 182 | int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, |
| 182 | unsigned long arg) | 183 | unsigned long arg) |
| 183 | { | 184 | { |
| 185 | long old_block, new_block; | ||
| 184 | int result = -EINVAL; | 186 | int result = -EINVAL; |
| 185 | 187 | ||
| 186 | if (file_permission(filp, MAY_READ) != 0) { | 188 | if (file_permission(filp, MAY_READ) != 0) { |
| 187 | udf_debug("no permission to access inode %lu\n", inode->i_ino); | 189 | udf_debug("no permission to access inode %lu\n", |
| 190 | inode->i_ino); | ||
| 188 | return -EPERM; | 191 | return -EPERM; |
| 189 | } | 192 | } |
| 190 | 193 | ||
| @@ -196,26 +199,19 @@ int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
| 196 | switch (cmd) { | 199 | switch (cmd) { |
| 197 | case UDF_GETVOLIDENT: | 200 | case UDF_GETVOLIDENT: |
| 198 | return copy_to_user((char __user *)arg, | 201 | return copy_to_user((char __user *)arg, |
| 199 | UDF_SB_VOLIDENT(inode->i_sb), | 202 | UDF_SB_VOLIDENT(inode->i_sb), 32) ? -EFAULT : 0; |
| 200 | 32) ? -EFAULT : 0; | ||
| 201 | case UDF_RELOCATE_BLOCKS: | 203 | case UDF_RELOCATE_BLOCKS: |
| 202 | { | 204 | if (!capable(CAP_SYS_ADMIN)) |
| 203 | long old, new; | 205 | return -EACCES; |
| 204 | 206 | if (get_user(old_block, (long __user *)arg)) | |
| 205 | if (!capable(CAP_SYS_ADMIN)) | 207 | return -EFAULT; |
| 206 | return -EACCES; | 208 | if ((result = udf_relocate_blocks(inode->i_sb, |
| 207 | if (get_user(old, (long __user *)arg)) | 209 | old_block, &new_block)) == 0) |
| 208 | return -EFAULT; | 210 | result = put_user(new_block, (long __user *)arg); |
| 209 | if ((result = udf_relocate_blocks(inode->i_sb, | 211 | return result; |
| 210 | old, &new)) == 0) | ||
| 211 | result = put_user(new, (long __user *)arg); | ||
| 212 | |||
| 213 | return result; | ||
| 214 | } | ||
| 215 | case UDF_GETEASIZE: | 212 | case UDF_GETEASIZE: |
| 216 | result = put_user(UDF_I_LENEATTR(inode), (int __user *)arg); | 213 | result = put_user(UDF_I_LENEATTR(inode), (int __user *)arg); |
| 217 | break; | 214 | break; |
| 218 | |||
| 219 | case UDF_GETEABLOCK: | 215 | case UDF_GETEABLOCK: |
| 220 | result = copy_to_user((char __user *)arg, UDF_I_DATA(inode), | 216 | result = copy_to_user((char __user *)arg, UDF_I_DATA(inode), |
| 221 | UDF_I_LENEATTR(inode)) ? -EFAULT : 0; | 217 | UDF_I_LENEATTR(inode)) ? -EFAULT : 0; |
| @@ -248,16 +244,16 @@ static int udf_release_file(struct inode *inode, struct file *filp) | |||
| 248 | } | 244 | } |
| 249 | 245 | ||
| 250 | const struct file_operations udf_file_operations = { | 246 | const struct file_operations udf_file_operations = { |
| 251 | .read = do_sync_read, | 247 | .read = do_sync_read, |
| 252 | .aio_read = generic_file_aio_read, | 248 | .aio_read = generic_file_aio_read, |
| 253 | .ioctl = udf_ioctl, | 249 | .ioctl = udf_ioctl, |
| 254 | .open = generic_file_open, | 250 | .open = generic_file_open, |
| 255 | .mmap = generic_file_mmap, | 251 | .mmap = generic_file_mmap, |
| 256 | .write = do_sync_write, | 252 | .write = do_sync_write, |
| 257 | .aio_write = udf_file_aio_write, | 253 | .aio_write = udf_file_aio_write, |
| 258 | .release = udf_release_file, | 254 | .release = udf_release_file, |
| 259 | .fsync = udf_fsync_file, | 255 | .fsync = udf_fsync_file, |
| 260 | .splice_read = generic_file_splice_read, | 256 | .splice_read = generic_file_splice_read, |
| 261 | }; | 257 | }; |
| 262 | 258 | ||
| 263 | const struct inode_operations udf_file_inode_operations = { | 259 | const struct inode_operations udf_file_inode_operations = { |
diff --git a/fs/udf/fsync.c b/fs/udf/fsync.c index 7f0901c4f1f1..b2c472b733b8 100644 --- a/fs/udf/fsync.c +++ b/fs/udf/fsync.c | |||
| @@ -32,6 +32,7 @@ static int udf_fsync_inode(struct inode *, int); | |||
| 32 | int udf_fsync_file(struct file *file, struct dentry *dentry, int datasync) | 32 | int udf_fsync_file(struct file *file, struct dentry *dentry, int datasync) |
| 33 | { | 33 | { |
| 34 | struct inode *inode = dentry->d_inode; | 34 | struct inode *inode = dentry->d_inode; |
| 35 | |||
| 35 | return udf_fsync_inode(inode, datasync); | 36 | return udf_fsync_inode(inode, datasync); |
| 36 | } | 37 | } |
| 37 | 38 | ||
| @@ -46,5 +47,6 @@ static int udf_fsync_inode(struct inode *inode, int datasync) | |||
| 46 | return err; | 47 | return err; |
| 47 | 48 | ||
| 48 | err |= udf_sync_inode(inode); | 49 | err |= udf_sync_inode(inode); |
| 50 | |||
| 49 | return err ? -EIO : 0; | 51 | return err ? -EIO : 0; |
| 50 | } | 52 | } |
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 2eb503806bce..636d8f613929 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
| @@ -46,12 +46,10 @@ void udf_free_inode(struct inode *inode) | |||
| 46 | if (sbi->s_lvidbh) { | 46 | if (sbi->s_lvidbh) { |
| 47 | if (S_ISDIR(inode->i_mode)) | 47 | if (S_ISDIR(inode->i_mode)) |
| 48 | UDF_SB_LVIDIU(sb)->numDirs = | 48 | UDF_SB_LVIDIU(sb)->numDirs = |
| 49 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs) | 49 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs) - 1); |
| 50 | - 1); | ||
| 51 | else | 50 | else |
| 52 | UDF_SB_LVIDIU(sb)->numFiles = | 51 | UDF_SB_LVIDIU(sb)->numFiles = |
| 53 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) | 52 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) - 1); |
| 54 | - 1); | ||
| 55 | 53 | ||
| 56 | mark_buffer_dirty(sbi->s_lvidbh); | 54 | mark_buffer_dirty(sbi->s_lvidbh); |
| 57 | } | 55 | } |
| @@ -82,10 +80,8 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 82 | UDF_I_NEXT_ALLOC_GOAL(inode) = 0; | 80 | UDF_I_NEXT_ALLOC_GOAL(inode) = 0; |
| 83 | UDF_I_STRAT4096(inode) = 0; | 81 | UDF_I_STRAT4096(inode) = 0; |
| 84 | 82 | ||
| 85 | block = | 83 | block = udf_new_block(dir->i_sb, NULL, UDF_I_LOCATION(dir).partitionReferenceNum, |
| 86 | udf_new_block(dir->i_sb, NULL, | 84 | start, err); |
| 87 | UDF_I_LOCATION(dir).partitionReferenceNum, start, | ||
| 88 | err); | ||
| 89 | if (*err) { | 85 | if (*err) { |
| 90 | iput(inode); | 86 | iput(inode); |
| 91 | return NULL; | 87 | return NULL; |
| @@ -95,17 +91,13 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 95 | if (UDF_SB_LVIDBH(sb)) { | 91 | if (UDF_SB_LVIDBH(sb)) { |
| 96 | struct logicalVolHeaderDesc *lvhd; | 92 | struct logicalVolHeaderDesc *lvhd; |
| 97 | uint64_t uniqueID; | 93 | uint64_t uniqueID; |
| 98 | lvhd = | 94 | lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(sb)->logicalVolContentsUse); |
| 99 | (struct logicalVolHeaderDesc *)(UDF_SB_LVID(sb)-> | ||
| 100 | logicalVolContentsUse); | ||
| 101 | if (S_ISDIR(mode)) | 95 | if (S_ISDIR(mode)) |
| 102 | UDF_SB_LVIDIU(sb)->numDirs = | 96 | UDF_SB_LVIDIU(sb)->numDirs = |
| 103 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs) | 97 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs) + 1); |
| 104 | + 1); | ||
| 105 | else | 98 | else |
| 106 | UDF_SB_LVIDIU(sb)->numFiles = | 99 | UDF_SB_LVIDIU(sb)->numFiles = |
| 107 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) | 100 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) + 1); |
| 108 | + 1); | ||
| 109 | UDF_I_UNIQUE(inode) = uniqueID = le64_to_cpu(lvhd->uniqueID); | 101 | UDF_I_UNIQUE(inode) = uniqueID = le64_to_cpu(lvhd->uniqueID); |
| 110 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) | 102 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) |
| 111 | uniqueID += 16; | 103 | uniqueID += 16; |
| @@ -118,12 +110,12 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 118 | inode->i_gid = dir->i_gid; | 110 | inode->i_gid = dir->i_gid; |
| 119 | if (S_ISDIR(mode)) | 111 | if (S_ISDIR(mode)) |
| 120 | mode |= S_ISGID; | 112 | mode |= S_ISGID; |
| 121 | } else | 113 | } else { |
| 122 | inode->i_gid = current->fsgid; | 114 | inode->i_gid = current->fsgid; |
| 115 | } | ||
| 123 | 116 | ||
| 124 | UDF_I_LOCATION(inode).logicalBlockNum = block; | 117 | UDF_I_LOCATION(inode).logicalBlockNum = block; |
| 125 | UDF_I_LOCATION(inode).partitionReferenceNum = | 118 | UDF_I_LOCATION(inode).partitionReferenceNum = UDF_I_LOCATION(dir).partitionReferenceNum; |
| 126 | UDF_I_LOCATION(dir).partitionReferenceNum; | ||
| 127 | inode->i_ino = udf_get_lb_pblock(sb, UDF_I_LOCATION(inode), 0); | 119 | inode->i_ino = udf_get_lb_pblock(sb, UDF_I_LOCATION(inode), 0); |
| 128 | inode->i_blocks = 0; | 120 | inode->i_blocks = 0; |
| 129 | UDF_I_LENEATTR(inode) = 0; | 121 | UDF_I_LENEATTR(inode) = 0; |
| @@ -132,14 +124,10 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 132 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { | 124 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { |
| 133 | UDF_I_EFE(inode) = 1; | 125 | UDF_I_EFE(inode) = 1; |
| 134 | UDF_UPDATE_UDFREV(inode->i_sb, UDF_VERS_USE_EXTENDED_FE); | 126 | UDF_UPDATE_UDFREV(inode->i_sb, UDF_VERS_USE_EXTENDED_FE); |
| 135 | UDF_I_DATA(inode) = | 127 | UDF_I_DATA(inode) = kzalloc(inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry), GFP_KERNEL); |
| 136 | kzalloc(inode->i_sb->s_blocksize - | ||
| 137 | sizeof(struct extendedFileEntry), GFP_KERNEL); | ||
| 138 | } else { | 128 | } else { |
| 139 | UDF_I_EFE(inode) = 0; | 129 | UDF_I_EFE(inode) = 0; |
| 140 | UDF_I_DATA(inode) = | 130 | UDF_I_DATA(inode) = kzalloc(inode->i_sb->s_blocksize - sizeof(struct fileEntry), GFP_KERNEL); |
| 141 | kzalloc(inode->i_sb->s_blocksize - sizeof(struct fileEntry), | ||
| 142 | GFP_KERNEL); | ||
| 143 | } | 131 | } |
| 144 | if (!UDF_I_DATA(inode)) { | 132 | if (!UDF_I_DATA(inode)) { |
| 145 | iput(inode); | 133 | iput(inode); |
| @@ -154,7 +142,7 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 154 | else | 142 | else |
| 155 | UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG; | 143 | UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG; |
| 156 | inode->i_mtime = inode->i_atime = inode->i_ctime = | 144 | inode->i_mtime = inode->i_atime = inode->i_ctime = |
| 157 | UDF_I_CRTIME(inode) = current_fs_time(inode->i_sb); | 145 | UDF_I_CRTIME(inode) = current_fs_time(inode->i_sb); |
| 158 | insert_inode_hash(inode); | 146 | insert_inode_hash(inode); |
| 159 | mark_inode_dirty(inode); | 147 | mark_inode_dirty(inode); |
| 160 | mutex_unlock(&sbi->s_alloc_mutex); | 148 | mutex_unlock(&sbi->s_alloc_mutex); |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index be6326f449a1..0d2c41666cd2 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -97,7 +97,8 @@ void udf_delete_inode(struct inode *inode) | |||
| 97 | 97 | ||
| 98 | unlock_kernel(); | 98 | unlock_kernel(); |
| 99 | return; | 99 | return; |
| 100 | no_delete: | 100 | |
| 101 | no_delete: | ||
| 101 | clear_inode(inode); | 102 | clear_inode(inode); |
| 102 | } | 103 | } |
| 103 | 104 | ||
| @@ -144,12 +145,12 @@ static sector_t udf_bmap(struct address_space *mapping, sector_t block) | |||
| 144 | } | 145 | } |
| 145 | 146 | ||
| 146 | const struct address_space_operations udf_aops = { | 147 | const struct address_space_operations udf_aops = { |
| 147 | .readpage = udf_readpage, | 148 | .readpage = udf_readpage, |
| 148 | .writepage = udf_writepage, | 149 | .writepage = udf_writepage, |
| 149 | .sync_page = block_sync_page, | 150 | .sync_page = block_sync_page, |
| 150 | .prepare_write = udf_prepare_write, | 151 | .prepare_write = udf_prepare_write, |
| 151 | .commit_write = generic_commit_write, | 152 | .commit_write = generic_commit_write, |
| 152 | .bmap = udf_bmap, | 153 | .bmap = udf_bmap, |
| 153 | }; | 154 | }; |
| 154 | 155 | ||
| 155 | void udf_expand_file_adinicb(struct inode *inode, int newsize, int *err) | 156 | void udf_expand_file_adinicb(struct inode *inode, int newsize, int *err) |
| @@ -230,12 +231,10 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block, | |||
| 230 | *block = udf_new_block(inode->i_sb, inode, | 231 | *block = udf_new_block(inode->i_sb, inode, |
| 231 | UDF_I_LOCATION(inode).partitionReferenceNum, | 232 | UDF_I_LOCATION(inode).partitionReferenceNum, |
| 232 | UDF_I_LOCATION(inode).logicalBlockNum, err); | 233 | UDF_I_LOCATION(inode).logicalBlockNum, err); |
| 233 | |||
| 234 | if (!(*block)) | 234 | if (!(*block)) |
| 235 | return NULL; | 235 | return NULL; |
| 236 | newblock = udf_get_pblock(inode->i_sb, *block, | 236 | newblock = udf_get_pblock(inode->i_sb, *block, |
| 237 | UDF_I_LOCATION(inode).partitionReferenceNum, | 237 | UDF_I_LOCATION(inode).partitionReferenceNum, 0); |
| 238 | 0); | ||
| 239 | if (!newblock) | 238 | if (!newblock) |
| 240 | return NULL; | 239 | return NULL; |
| 241 | dbh = udf_tgetblk(inode->i_sb, newblock); | 240 | dbh = udf_tgetblk(inode->i_sb, newblock); |
| @@ -247,16 +246,13 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block, | |||
| 247 | unlock_buffer(dbh); | 246 | unlock_buffer(dbh); |
| 248 | mark_buffer_dirty_inode(dbh, inode); | 247 | mark_buffer_dirty_inode(dbh, inode); |
| 249 | 248 | ||
| 250 | sfibh.soffset = sfibh.eoffset = | 249 | sfibh.soffset = sfibh.eoffset = (f_pos & ((inode->i_sb->s_blocksize - 1) >> 2)) << 2; |
| 251 | (f_pos & ((inode->i_sb->s_blocksize - 1) >> 2)) << 2; | ||
| 252 | sfibh.sbh = sfibh.ebh = NULL; | 250 | sfibh.sbh = sfibh.ebh = NULL; |
| 253 | dfibh.soffset = dfibh.eoffset = 0; | 251 | dfibh.soffset = dfibh.eoffset = 0; |
| 254 | dfibh.sbh = dfibh.ebh = dbh; | 252 | dfibh.sbh = dfibh.ebh = dbh; |
| 255 | while ((f_pos < size)) { | 253 | while ((f_pos < size)) { |
| 256 | UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB; | 254 | UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB; |
| 257 | sfi = | 255 | sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, NULL, NULL, NULL); |
| 258 | udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, NULL, | ||
| 259 | NULL, NULL); | ||
| 260 | if (!sfi) { | 256 | if (!sfi) { |
| 261 | brelse(dbh); | 257 | brelse(dbh); |
| 262 | return NULL; | 258 | return NULL; |
| @@ -267,8 +263,7 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block, | |||
| 267 | dfibh.eoffset += (sfibh.eoffset - sfibh.soffset); | 263 | dfibh.eoffset += (sfibh.eoffset - sfibh.soffset); |
| 268 | dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset); | 264 | dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset); |
| 269 | if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse, | 265 | if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse, |
| 270 | sfi->fileIdent + | 266 | sfi->fileIdent + le16_to_cpu(sfi->lengthOfImpUse))) { |
| 271 | le16_to_cpu(sfi->lengthOfImpUse))) { | ||
| 272 | UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB; | 267 | UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB; |
| 273 | brelse(dbh); | 268 | brelse(dbh); |
| 274 | return NULL; | 269 | return NULL; |
| @@ -276,12 +271,10 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block, | |||
| 276 | } | 271 | } |
| 277 | mark_buffer_dirty_inode(dbh, inode); | 272 | mark_buffer_dirty_inode(dbh, inode); |
| 278 | 273 | ||
| 279 | memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode), 0, | 274 | memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode), 0, UDF_I_LENALLOC(inode)); |
| 280 | UDF_I_LENALLOC(inode)); | ||
| 281 | UDF_I_LENALLOC(inode) = 0; | 275 | UDF_I_LENALLOC(inode) = 0; |
| 282 | eloc.logicalBlockNum = *block; | 276 | eloc.logicalBlockNum = *block; |
| 283 | eloc.partitionReferenceNum = | 277 | eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum; |
| 284 | UDF_I_LOCATION(inode).partitionReferenceNum; | ||
| 285 | elen = inode->i_size; | 278 | elen = inode->i_size; |
| 286 | UDF_I_LENEXTENTS(inode) = elen; | 279 | UDF_I_LENEXTENTS(inode) = elen; |
| 287 | epos.bh = NULL; | 280 | epos.bh = NULL; |
| @@ -334,11 +327,12 @@ static int udf_get_block(struct inode *inode, sector_t block, | |||
| 334 | if (new) | 327 | if (new) |
| 335 | set_buffer_new(bh_result); | 328 | set_buffer_new(bh_result); |
| 336 | map_bh(bh_result, inode->i_sb, phys); | 329 | map_bh(bh_result, inode->i_sb, phys); |
| 337 | abort: | 330 | |
| 331 | abort: | ||
| 338 | unlock_kernel(); | 332 | unlock_kernel(); |
| 339 | return err; | 333 | return err; |
| 340 | 334 | ||
| 341 | abort_negative: | 335 | abort_negative: |
| 342 | udf_warning(inode->i_sb, "udf_get_block", "block < 0"); | 336 | udf_warning(inode->i_sb, "udf_get_block", "block < 0"); |
| 343 | goto abort; | 337 | goto abort; |
| 344 | } | 338 | } |
| @@ -346,13 +340,13 @@ static int udf_get_block(struct inode *inode, sector_t block, | |||
| 346 | static struct buffer_head *udf_getblk(struct inode *inode, long block, | 340 | static struct buffer_head *udf_getblk(struct inode *inode, long block, |
| 347 | int create, int *err) | 341 | int create, int *err) |
| 348 | { | 342 | { |
| 343 | struct buffer_head *bh; | ||
| 349 | struct buffer_head dummy; | 344 | struct buffer_head dummy; |
| 350 | 345 | ||
| 351 | dummy.b_state = 0; | 346 | dummy.b_state = 0; |
| 352 | dummy.b_blocknr = -1000; | 347 | dummy.b_blocknr = -1000; |
| 353 | *err = udf_get_block(inode, block, &dummy, create); | 348 | *err = udf_get_block(inode, block, &dummy, create); |
| 354 | if (!*err && buffer_mapped(&dummy)) { | 349 | if (!*err && buffer_mapped(&dummy)) { |
| 355 | struct buffer_head *bh; | ||
| 356 | bh = sb_getblk(inode->i_sb, dummy.b_blocknr); | 350 | bh = sb_getblk(inode->i_sb, dummy.b_blocknr); |
| 357 | if (buffer_new(&dummy)) { | 351 | if (buffer_new(&dummy)) { |
| 358 | lock_buffer(bh); | 352 | lock_buffer(bh); |
| @@ -363,6 +357,7 @@ static struct buffer_head *udf_getblk(struct inode *inode, long block, | |||
| 363 | } | 357 | } |
| 364 | return bh; | 358 | return bh; |
| 365 | } | 359 | } |
| 360 | |||
| 366 | return NULL; | 361 | return NULL; |
| 367 | } | 362 | } |
| 368 | 363 | ||
| @@ -373,42 +368,41 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
| 373 | sector_t add; | 368 | sector_t add; |
| 374 | int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); | 369 | int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); |
| 375 | struct super_block *sb = inode->i_sb; | 370 | struct super_block *sb = inode->i_sb; |
| 376 | kernel_lb_addr prealloc_loc = { 0, 0 }; | 371 | kernel_lb_addr prealloc_loc = {}; |
| 377 | int prealloc_len = 0; | 372 | int prealloc_len = 0; |
| 378 | 373 | ||
| 379 | /* The previous extent is fake and we should not extend by anything | 374 | /* The previous extent is fake and we should not extend by anything |
| 380 | * - there's nothing to do... */ | 375 | * - there's nothing to do... */ |
| 381 | if (!blocks && fake) | 376 | if (!blocks && fake) |
| 382 | return 0; | 377 | return 0; |
| 378 | |||
| 383 | /* Round the last extent up to a multiple of block size */ | 379 | /* Round the last extent up to a multiple of block size */ |
| 384 | if (last_ext->extLength & (sb->s_blocksize - 1)) { | 380 | if (last_ext->extLength & (sb->s_blocksize - 1)) { |
| 385 | last_ext->extLength = | 381 | last_ext->extLength = |
| 386 | (last_ext->extLength & UDF_EXTENT_FLAG_MASK) | | 382 | (last_ext->extLength & UDF_EXTENT_FLAG_MASK) | |
| 387 | (((last_ext->extLength & UDF_EXTENT_LENGTH_MASK) + | 383 | (((last_ext->extLength & UDF_EXTENT_LENGTH_MASK) + |
| 388 | sb->s_blocksize - 1) & ~(sb->s_blocksize - 1)); | 384 | sb->s_blocksize - 1) & ~(sb->s_blocksize - 1)); |
| 389 | UDF_I_LENEXTENTS(inode) = | 385 | UDF_I_LENEXTENTS(inode) = |
| 390 | (UDF_I_LENEXTENTS(inode) + sb->s_blocksize - 1) & | 386 | (UDF_I_LENEXTENTS(inode) + sb->s_blocksize - 1) & |
| 391 | ~(sb->s_blocksize - 1); | 387 | ~(sb->s_blocksize - 1); |
| 392 | } | 388 | } |
| 389 | |||
| 393 | /* Last extent are just preallocated blocks? */ | 390 | /* Last extent are just preallocated blocks? */ |
| 394 | if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == | 391 | if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == EXT_NOT_RECORDED_ALLOCATED) { |
| 395 | EXT_NOT_RECORDED_ALLOCATED) { | ||
| 396 | /* Save the extent so that we can reattach it to the end */ | 392 | /* Save the extent so that we can reattach it to the end */ |
| 397 | prealloc_loc = last_ext->extLocation; | 393 | prealloc_loc = last_ext->extLocation; |
| 398 | prealloc_len = last_ext->extLength; | 394 | prealloc_len = last_ext->extLength; |
| 399 | /* Mark the extent as a hole */ | 395 | /* Mark the extent as a hole */ |
| 400 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | | 396 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
| 401 | (last_ext->extLength & UDF_EXTENT_LENGTH_MASK); | 397 | (last_ext->extLength & UDF_EXTENT_LENGTH_MASK); |
| 402 | last_ext->extLocation.logicalBlockNum = 0; | 398 | last_ext->extLocation.logicalBlockNum = 0; |
| 403 | last_ext->extLocation.partitionReferenceNum = 0; | 399 | last_ext->extLocation.partitionReferenceNum = 0; |
| 404 | } | 400 | } |
| 401 | |||
| 405 | /* Can we merge with the previous extent? */ | 402 | /* Can we merge with the previous extent? */ |
| 406 | if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == | 403 | if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == EXT_NOT_RECORDED_NOT_ALLOCATED) { |
| 407 | EXT_NOT_RECORDED_NOT_ALLOCATED) { | 404 | add = ((1 << 30) - sb->s_blocksize - (last_ext->extLength & |
| 408 | add = | 405 | UDF_EXTENT_LENGTH_MASK)) >> sb->s_blocksize_bits; |
| 409 | ((1 << 30) - sb->s_blocksize - | ||
| 410 | (last_ext->extLength & UDF_EXTENT_LENGTH_MASK)) >> sb-> | ||
| 411 | s_blocksize_bits; | ||
| 412 | if (add > blocks) | 406 | if (add > blocks) |
| 413 | add = blocks; | 407 | add = blocks; |
| 414 | blocks -= add; | 408 | blocks -= add; |
| @@ -419,19 +413,20 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
| 419 | udf_add_aext(inode, last_pos, last_ext->extLocation, | 413 | udf_add_aext(inode, last_pos, last_ext->extLocation, |
| 420 | last_ext->extLength, 1); | 414 | last_ext->extLength, 1); |
| 421 | count++; | 415 | count++; |
| 422 | } else | 416 | } else { |
| 423 | udf_write_aext(inode, last_pos, last_ext->extLocation, | 417 | udf_write_aext(inode, last_pos, last_ext->extLocation, last_ext->extLength, 1); |
| 424 | last_ext->extLength, 1); | 418 | } |
| 419 | |||
| 425 | /* Managed to do everything necessary? */ | 420 | /* Managed to do everything necessary? */ |
| 426 | if (!blocks) | 421 | if (!blocks) |
| 427 | goto out; | 422 | goto out; |
| 428 | 423 | ||
| 429 | /* All further extents will be NOT_RECORDED_NOT_ALLOCATED */ | 424 | /* All further extents will be NOT_RECORDED_NOT_ALLOCATED */ |
| 430 | last_ext->extLocation.logicalBlockNum = 0; | 425 | last_ext->extLocation.logicalBlockNum = 0; |
| 431 | last_ext->extLocation.partitionReferenceNum = 0; | 426 | last_ext->extLocation.partitionReferenceNum = 0; |
| 432 | add = (1 << (30 - sb->s_blocksize_bits)) - 1; | 427 | add = (1 << (30-sb->s_blocksize_bits)) - 1; |
| 433 | last_ext->extLength = | 428 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | (add << sb->s_blocksize_bits); |
| 434 | EXT_NOT_RECORDED_NOT_ALLOCATED | (add << sb->s_blocksize_bits); | 429 | |
| 435 | /* Create enough extents to cover the whole hole */ | 430 | /* Create enough extents to cover the whole hole */ |
| 436 | while (blocks > add) { | 431 | while (blocks > add) { |
| 437 | blocks -= add; | 432 | blocks -= add; |
| @@ -442,22 +437,23 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
| 442 | } | 437 | } |
| 443 | if (blocks) { | 438 | if (blocks) { |
| 444 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | | 439 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
| 445 | (blocks << sb->s_blocksize_bits); | 440 | (blocks << sb->s_blocksize_bits); |
| 446 | if (udf_add_aext(inode, last_pos, last_ext->extLocation, | 441 | if (udf_add_aext(inode, last_pos, last_ext->extLocation, |
| 447 | last_ext->extLength, 1) == -1) | 442 | last_ext->extLength, 1) == -1) |
| 448 | return -1; | 443 | return -1; |
| 449 | count++; | 444 | count++; |
| 450 | } | 445 | } |
| 451 | out: | 446 | |
| 447 | out: | ||
| 452 | /* Do we have some preallocated blocks saved? */ | 448 | /* Do we have some preallocated blocks saved? */ |
| 453 | if (prealloc_len) { | 449 | if (prealloc_len) { |
| 454 | if (udf_add_aext(inode, last_pos, prealloc_loc, prealloc_len, 1) | 450 | if (udf_add_aext(inode, last_pos, prealloc_loc, prealloc_len, 1) == -1) |
| 455 | == -1) | ||
| 456 | return -1; | 451 | return -1; |
| 457 | last_ext->extLocation = prealloc_loc; | 452 | last_ext->extLocation = prealloc_loc; |
| 458 | last_ext->extLength = prealloc_len; | 453 | last_ext->extLength = prealloc_len; |
| 459 | count++; | 454 | count++; |
| 460 | } | 455 | } |
| 456 | |||
| 461 | /* last_pos should point to the last written extent... */ | 457 | /* last_pos should point to the last written extent... */ |
| 462 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT) | 458 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT) |
| 463 | last_pos->offset -= sizeof(short_ad); | 459 | last_pos->offset -= sizeof(short_ad); |
| @@ -465,6 +461,7 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
| 465 | last_pos->offset -= sizeof(long_ad); | 461 | last_pos->offset -= sizeof(long_ad); |
| 466 | else | 462 | else |
| 467 | return -1; | 463 | return -1; |
| 464 | |||
| 468 | return count; | 465 | return count; |
| 469 | } | 466 | } |
| 470 | 467 | ||
| @@ -490,7 +487,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 490 | prev_epos.block = UDF_I_LOCATION(inode); | 487 | prev_epos.block = UDF_I_LOCATION(inode); |
| 491 | prev_epos.bh = NULL; | 488 | prev_epos.bh = NULL; |
| 492 | cur_epos = next_epos = prev_epos; | 489 | cur_epos = next_epos = prev_epos; |
| 493 | b_off = (loff_t) block << inode->i_sb->s_blocksize_bits; | 490 | b_off = (loff_t)block << inode->i_sb->s_blocksize_bits; |
| 494 | 491 | ||
| 495 | /* find the extent which contains the block we are looking for. | 492 | /* find the extent which contains the block we are looking for. |
| 496 | alternate between laarr[0] and laarr[1] for locations of the | 493 | alternate between laarr[0] and laarr[1] for locations of the |
| @@ -515,8 +512,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 515 | prev_epos.offset = cur_epos.offset; | 512 | prev_epos.offset = cur_epos.offset; |
| 516 | cur_epos.offset = next_epos.offset; | 513 | cur_epos.offset = next_epos.offset; |
| 517 | 514 | ||
| 518 | if ((etype = | 515 | if ((etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 1)) == -1) |
| 519 | udf_next_aext(inode, &next_epos, &eloc, &elen, 1)) == -1) | ||
| 520 | break; | 516 | break; |
| 521 | 517 | ||
| 522 | c = !c; | 518 | c = !c; |
| @@ -526,8 +522,8 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 526 | 522 | ||
| 527 | if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) | 523 | if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) |
| 528 | pgoal = eloc.logicalBlockNum + | 524 | pgoal = eloc.logicalBlockNum + |
| 529 | ((elen + inode->i_sb->s_blocksize - 1) >> | 525 | ((elen + inode->i_sb->s_blocksize - 1) >> |
| 530 | inode->i_sb->s_blocksize_bits); | 526 | inode->i_sb->s_blocksize_bits); |
| 531 | 527 | ||
| 532 | count++; | 528 | count++; |
| 533 | } while (lbcount + elen <= b_off); | 529 | } while (lbcount + elen <= b_off); |
| @@ -547,8 +543,8 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 547 | if (etype == (EXT_RECORDED_ALLOCATED >> 30)) { | 543 | if (etype == (EXT_RECORDED_ALLOCATED >> 30)) { |
| 548 | if (elen & (inode->i_sb->s_blocksize - 1)) { | 544 | if (elen & (inode->i_sb->s_blocksize - 1)) { |
| 549 | elen = EXT_RECORDED_ALLOCATED | | 545 | elen = EXT_RECORDED_ALLOCATED | |
| 550 | ((elen + inode->i_sb->s_blocksize - 1) & | 546 | ((elen + inode->i_sb->s_blocksize - 1) & |
| 551 | ~(inode->i_sb->s_blocksize - 1)); | 547 | ~(inode->i_sb->s_blocksize - 1)); |
| 552 | etype = udf_write_aext(inode, &cur_epos, eloc, elen, 1); | 548 | etype = udf_write_aext(inode, &cur_epos, eloc, elen, 1); |
| 553 | } | 549 | } |
| 554 | brelse(prev_epos.bh); | 550 | brelse(prev_epos.bh); |
| @@ -570,8 +566,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 570 | startnum = 1; | 566 | startnum = 1; |
| 571 | } else { | 567 | } else { |
| 572 | /* Create a fake extent when there's not one */ | 568 | /* Create a fake extent when there's not one */ |
| 573 | memset(&laarr[0].extLocation, 0x00, | 569 | memset(&laarr[0].extLocation, 0x00, sizeof(kernel_lb_addr)); |
| 574 | sizeof(kernel_lb_addr)); | ||
| 575 | laarr[0].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; | 570 | laarr[0].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; |
| 576 | /* Will udf_extend_file() create real extent from a fake one? */ | 571 | /* Will udf_extend_file() create real extent from a fake one? */ |
| 577 | startnum = (offset > 0); | 572 | startnum = (offset > 0); |
| @@ -591,16 +586,14 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 591 | offset = 0; | 586 | offset = 0; |
| 592 | count += ret; | 587 | count += ret; |
| 593 | /* We are not covered by a preallocated extent? */ | 588 | /* We are not covered by a preallocated extent? */ |
| 594 | if ((laarr[0].extLength & UDF_EXTENT_FLAG_MASK) != | 589 | if ((laarr[0].extLength & UDF_EXTENT_FLAG_MASK) != EXT_NOT_RECORDED_ALLOCATED) { |
| 595 | EXT_NOT_RECORDED_ALLOCATED) { | ||
| 596 | /* Is there any real extent? - otherwise we overwrite | 590 | /* Is there any real extent? - otherwise we overwrite |
| 597 | * the fake one... */ | 591 | * the fake one... */ |
| 598 | if (count) | 592 | if (count) |
| 599 | c = !c; | 593 | c = !c; |
| 600 | laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | | 594 | laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
| 601 | inode->i_sb->s_blocksize; | 595 | inode->i_sb->s_blocksize; |
| 602 | memset(&laarr[c].extLocation, 0x00, | 596 | memset(&laarr[c].extLocation, 0x00, sizeof(kernel_lb_addr)); |
| 603 | sizeof(kernel_lb_addr)); | ||
| 604 | count++; | 597 | count++; |
| 605 | endnum++; | 598 | endnum++; |
| 606 | } | 599 | } |
| @@ -618,8 +611,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 618 | } | 611 | } |
| 619 | 612 | ||
| 620 | /* if the current block is located in an extent, read the next extent */ | 613 | /* if the current block is located in an extent, read the next extent */ |
| 621 | if ((etype = | 614 | if ((etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 0)) != -1) { |
| 622 | udf_next_aext(inode, &next_epos, &eloc, &elen, 0)) != -1) { | ||
| 623 | laarr[c + 1].extLength = (etype << 30) | elen; | 615 | laarr[c + 1].extLength = (etype << 30) | elen; |
| 624 | laarr[c + 1].extLocation = eloc; | 616 | laarr[c + 1].extLocation = eloc; |
| 625 | count++; | 617 | count++; |
| @@ -631,24 +623,21 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 631 | } | 623 | } |
| 632 | 624 | ||
| 633 | /* if the current extent is not recorded but allocated, get the | 625 | /* if the current extent is not recorded but allocated, get the |
| 634 | block in the extent corresponding to the requested block */ | 626 | * block in the extent corresponding to the requested block */ |
| 635 | if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) | 627 | if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
| 636 | newblocknum = laarr[c].extLocation.logicalBlockNum + offset; | 628 | newblocknum = laarr[c].extLocation.logicalBlockNum + offset; |
| 637 | else { /* otherwise, allocate a new block */ | 629 | } else { /* otherwise, allocate a new block */ |
| 638 | |||
| 639 | if (UDF_I_NEXT_ALLOC_BLOCK(inode) == block) | 630 | if (UDF_I_NEXT_ALLOC_BLOCK(inode) == block) |
| 640 | goal = UDF_I_NEXT_ALLOC_GOAL(inode); | 631 | goal = UDF_I_NEXT_ALLOC_GOAL(inode); |
| 641 | 632 | ||
| 642 | if (!goal) { | 633 | if (!goal) { |
| 643 | if (!(goal = pgoal)) | 634 | if (!(goal = pgoal)) |
| 644 | goal = | 635 | goal = UDF_I_LOCATION(inode).logicalBlockNum + 1; |
| 645 | UDF_I_LOCATION(inode).logicalBlockNum + 1; | ||
| 646 | } | 636 | } |
| 647 | 637 | ||
| 648 | if (!(newblocknum = udf_new_block(inode->i_sb, inode, | 638 | if (!(newblocknum = udf_new_block(inode->i_sb, inode, |
| 649 | UDF_I_LOCATION(inode). | 639 | UDF_I_LOCATION(inode).partitionReferenceNum, |
| 650 | partitionReferenceNum, goal, | 640 | goal, err))) { |
| 651 | err))) { | ||
| 652 | brelse(prev_epos.bh); | 641 | brelse(prev_epos.bh); |
| 653 | *err = -ENOSPC; | 642 | *err = -ENOSPC; |
| 654 | return NULL; | 643 | return NULL; |
| @@ -657,8 +646,8 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 657 | } | 646 | } |
| 658 | 647 | ||
| 659 | /* if the extent the requsted block is located in contains multiple blocks, | 648 | /* if the extent the requsted block is located in contains multiple blocks, |
| 660 | split the extent into at most three extents. blocks prior to requested | 649 | * split the extent into at most three extents. blocks prior to requested |
| 661 | block, requested block, and blocks after requested block */ | 650 | * block, requested block, and blocks after requested block */ |
| 662 | udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum); | 651 | udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum); |
| 663 | 652 | ||
| 664 | #ifdef UDF_PREALLOCATE | 653 | #ifdef UDF_PREALLOCATE |
| @@ -670,15 +659,14 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 670 | udf_merge_extents(inode, laarr, &endnum); | 659 | udf_merge_extents(inode, laarr, &endnum); |
| 671 | 660 | ||
| 672 | /* write back the new extents, inserting new extents if the new number | 661 | /* write back the new extents, inserting new extents if the new number |
| 673 | of extents is greater than the old number, and deleting extents if | 662 | * of extents is greater than the old number, and deleting extents if |
| 674 | the new number of extents is less than the old number */ | 663 | * the new number of extents is less than the old number */ |
| 675 | udf_update_extents(inode, laarr, startnum, endnum, &prev_epos); | 664 | udf_update_extents(inode, laarr, startnum, endnum, &prev_epos); |
| 676 | 665 | ||
| 677 | brelse(prev_epos.bh); | 666 | brelse(prev_epos.bh); |
| 678 | 667 | ||
| 679 | if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum, | 668 | if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum, |
| 680 | UDF_I_LOCATION(inode). | 669 | UDF_I_LOCATION(inode).partitionReferenceNum, 0))) { |
| 681 | partitionReferenceNum, 0))) { | ||
| 682 | return NULL; | 670 | return NULL; |
| 683 | } | 671 | } |
| 684 | *phys = newblock; | 672 | *phys = newblock; |
| @@ -692,6 +680,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
| 692 | udf_sync_inode(inode); | 680 | udf_sync_inode(inode); |
| 693 | else | 681 | else |
| 694 | mark_inode_dirty(inode); | 682 | mark_inode_dirty(inode); |
| 683 | |||
| 695 | return result; | 684 | return result; |
| 696 | } | 685 | } |
| 697 | 686 | ||
| @@ -701,16 +690,15 @@ static void udf_split_extents(struct inode *inode, int *c, int offset, | |||
| 701 | int *endnum) | 690 | int *endnum) |
| 702 | { | 691 | { |
| 703 | if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) || | 692 | if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) || |
| 704 | (laarr[*c].extLength >> 30) == | 693 | (laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) { |
| 705 | (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) { | ||
| 706 | int curr = *c; | 694 | int curr = *c; |
| 707 | int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) + | 695 | int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 708 | inode->i_sb->s_blocksize - | 696 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits; |
| 709 | 1) >> inode->i_sb->s_blocksize_bits; | ||
| 710 | int8_t etype = (laarr[curr].extLength >> 30); | 697 | int8_t etype = (laarr[curr].extLength >> 30); |
| 711 | 698 | ||
| 712 | if (blen == 1) ; | 699 | if (blen == 1) { |
| 713 | else if (!offset || blen == offset + 1) { | 700 | ; |
| 701 | } else if (!offset || blen == offset + 1) { | ||
| 714 | laarr[curr + 2] = laarr[curr + 1]; | 702 | laarr[curr + 2] = laarr[curr + 1]; |
| 715 | laarr[curr + 1] = laarr[curr]; | 703 | laarr[curr + 1] = laarr[curr]; |
| 716 | } else { | 704 | } else { |
| @@ -720,20 +708,15 @@ static void udf_split_extents(struct inode *inode, int *c, int offset, | |||
| 720 | 708 | ||
| 721 | if (offset) { | 709 | if (offset) { |
| 722 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { | 710 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
| 723 | udf_free_blocks(inode->i_sb, inode, | 711 | udf_free_blocks(inode->i_sb, inode, laarr[curr].extLocation, 0, offset); |
| 724 | laarr[curr].extLocation, 0, | 712 | laarr[curr].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
| 725 | offset); | 713 | (offset << inode->i_sb->s_blocksize_bits); |
| 726 | laarr[curr].extLength = | ||
| 727 | EXT_NOT_RECORDED_NOT_ALLOCATED | (offset << | ||
| 728 | inode-> | ||
| 729 | i_sb-> | ||
| 730 | s_blocksize_bits); | ||
| 731 | laarr[curr].extLocation.logicalBlockNum = 0; | 714 | laarr[curr].extLocation.logicalBlockNum = 0; |
| 732 | laarr[curr].extLocation.partitionReferenceNum = | 715 | laarr[curr].extLocation.partitionReferenceNum = 0; |
| 733 | 0; | 716 | } else { |
| 734 | } else | ||
| 735 | laarr[curr].extLength = (etype << 30) | | 717 | laarr[curr].extLength = (etype << 30) | |
| 736 | (offset << inode->i_sb->s_blocksize_bits); | 718 | (offset << inode->i_sb->s_blocksize_bits); |
| 719 | } | ||
| 737 | curr++; | 720 | curr++; |
| 738 | (*c)++; | 721 | (*c)++; |
| 739 | (*endnum)++; | 722 | (*endnum)++; |
| @@ -742,18 +725,16 @@ static void udf_split_extents(struct inode *inode, int *c, int offset, | |||
| 742 | laarr[curr].extLocation.logicalBlockNum = newblocknum; | 725 | laarr[curr].extLocation.logicalBlockNum = newblocknum; |
| 743 | if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) | 726 | if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) |
| 744 | laarr[curr].extLocation.partitionReferenceNum = | 727 | laarr[curr].extLocation.partitionReferenceNum = |
| 745 | UDF_I_LOCATION(inode).partitionReferenceNum; | 728 | UDF_I_LOCATION(inode).partitionReferenceNum; |
| 746 | laarr[curr].extLength = EXT_RECORDED_ALLOCATED | | 729 | laarr[curr].extLength = EXT_RECORDED_ALLOCATED | |
| 747 | inode->i_sb->s_blocksize; | 730 | inode->i_sb->s_blocksize; |
| 748 | curr++; | 731 | curr++; |
| 749 | 732 | ||
| 750 | if (blen != offset + 1) { | 733 | if (blen != offset + 1) { |
| 751 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) | 734 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) |
| 752 | laarr[curr].extLocation.logicalBlockNum += | 735 | laarr[curr].extLocation.logicalBlockNum += (offset + 1); |
| 753 | (offset + 1); | 736 | laarr[curr].extLength = (etype << 30) | |
| 754 | laarr[curr].extLength = | 737 | ((blen - (offset + 1)) << inode->i_sb->s_blocksize_bits); |
| 755 | (etype << 30) | ((blen - (offset + 1)) << inode-> | ||
| 756 | i_sb->s_blocksize_bits); | ||
| 757 | curr++; | 738 | curr++; |
| 758 | (*endnum)++; | 739 | (*endnum)++; |
| 759 | } | 740 | } |
| @@ -772,90 +753,69 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock, | |||
| 772 | else | 753 | else |
| 773 | start = c; | 754 | start = c; |
| 774 | } else { | 755 | } else { |
| 775 | if ((laarr[c + 1].extLength >> 30) == | 756 | if ((laarr[c + 1].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
| 776 | (EXT_NOT_RECORDED_ALLOCATED >> 30)) { | ||
| 777 | start = c + 1; | 757 | start = c + 1; |
| 778 | length = currlength = | 758 | length = currlength = (((laarr[c + 1].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 779 | (((laarr[c + 1]. | 759 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits); |
| 780 | extLength & UDF_EXTENT_LENGTH_MASK) + | 760 | } else { |
| 781 | inode->i_sb->s_blocksize - | ||
| 782 | 1) >> inode->i_sb->s_blocksize_bits); | ||
| 783 | } else | ||
| 784 | start = c; | 761 | start = c; |
| 762 | } | ||
| 785 | } | 763 | } |
| 786 | 764 | ||
| 787 | for (i = start + 1; i <= *endnum; i++) { | 765 | for (i = start + 1; i <= *endnum; i++) { |
| 788 | if (i == *endnum) { | 766 | if (i == *endnum) { |
| 789 | if (lastblock) | 767 | if (lastblock) |
| 790 | length += UDF_DEFAULT_PREALLOC_BLOCKS; | 768 | length += UDF_DEFAULT_PREALLOC_BLOCKS; |
| 791 | } else if ((laarr[i].extLength >> 30) == | 769 | } else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) { |
| 792 | (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) | 770 | length += (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 793 | length += | 771 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits); |
| 794 | (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + | 772 | } else { |
| 795 | inode->i_sb->s_blocksize - | ||
| 796 | 1) >> inode->i_sb->s_blocksize_bits); | ||
| 797 | else | ||
| 798 | break; | 773 | break; |
| 774 | } | ||
| 799 | } | 775 | } |
| 800 | 776 | ||
| 801 | if (length) { | 777 | if (length) { |
| 802 | int next = laarr[start].extLocation.logicalBlockNum + | 778 | int next = laarr[start].extLocation.logicalBlockNum + |
| 803 | (((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) + | 779 | (((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 804 | inode->i_sb->s_blocksize - | 780 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits); |
| 805 | 1) >> inode->i_sb->s_blocksize_bits); | ||
| 806 | int numalloc = udf_prealloc_blocks(inode->i_sb, inode, | 781 | int numalloc = udf_prealloc_blocks(inode->i_sb, inode, |
| 807 | laarr[start].extLocation. | 782 | laarr[start].extLocation.partitionReferenceNum, |
| 808 | partitionReferenceNum, | 783 | next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ? length : |
| 809 | next, | 784 | UDF_DEFAULT_PREALLOC_BLOCKS) - currlength); |
| 810 | (UDF_DEFAULT_PREALLOC_BLOCKS | 785 | if (numalloc) { |
| 811 | > | 786 | if (start == (c + 1)) { |
| 812 | length ? length : | ||
| 813 | UDF_DEFAULT_PREALLOC_BLOCKS) | ||
| 814 | - currlength); | ||
| 815 | |||
| 816 | if (numalloc) { | ||
| 817 | if (start == (c + 1)) | ||
| 818 | laarr[start].extLength += | 787 | laarr[start].extLength += |
| 819 | (numalloc << inode->i_sb->s_blocksize_bits); | 788 | (numalloc << inode->i_sb->s_blocksize_bits); |
| 820 | else { | 789 | } else { |
| 821 | memmove(&laarr[c + 2], &laarr[c + 1], | 790 | memmove(&laarr[c + 2], &laarr[c + 1], |
| 822 | sizeof(long_ad) * (*endnum - (c + 1))); | 791 | sizeof(long_ad) * (*endnum - (c + 1))); |
| 823 | (*endnum)++; | 792 | (*endnum)++; |
| 824 | laarr[c + 1].extLocation.logicalBlockNum = next; | 793 | laarr[c + 1].extLocation.logicalBlockNum = next; |
| 825 | laarr[c + 1].extLocation.partitionReferenceNum = | 794 | laarr[c + 1].extLocation.partitionReferenceNum = |
| 826 | laarr[c].extLocation.partitionReferenceNum; | 795 | laarr[c].extLocation.partitionReferenceNum; |
| 827 | laarr[c + 1].extLength = | 796 | laarr[c + 1].extLength = EXT_NOT_RECORDED_ALLOCATED | |
| 828 | EXT_NOT_RECORDED_ALLOCATED | (numalloc << | 797 | (numalloc << inode->i_sb->s_blocksize_bits); |
| 829 | inode->i_sb-> | ||
| 830 | s_blocksize_bits); | ||
| 831 | start = c + 1; | 798 | start = c + 1; |
| 832 | } | 799 | } |
| 833 | 800 | ||
| 834 | for (i = start + 1; numalloc && i < *endnum; i++) { | 801 | for (i = start + 1; numalloc && i < *endnum; i++) { |
| 835 | int elen = | 802 | int elen = ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 836 | ((laarr[i]. | 803 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits; |
| 837 | extLength & UDF_EXTENT_LENGTH_MASK) + | ||
| 838 | inode->i_sb->s_blocksize - | ||
| 839 | 1) >> inode->i_sb->s_blocksize_bits; | ||
| 840 | 804 | ||
| 841 | if (elen > numalloc) { | 805 | if (elen > numalloc) { |
| 842 | laarr[i].extLength -= | 806 | laarr[i].extLength -= |
| 843 | (numalloc << inode->i_sb-> | 807 | (numalloc << inode->i_sb->s_blocksize_bits); |
| 844 | s_blocksize_bits); | ||
| 845 | numalloc = 0; | 808 | numalloc = 0; |
| 846 | } else { | 809 | } else { |
| 847 | numalloc -= elen; | 810 | numalloc -= elen; |
| 848 | if (*endnum > (i + 1)) | 811 | if (*endnum > (i + 1)) |
| 849 | memmove(&laarr[i], | 812 | memmove(&laarr[i], &laarr[i + 1], |
| 850 | &laarr[i + 1], | 813 | sizeof(long_ad) * (*endnum - (i + 1))); |
| 851 | sizeof(long_ad) * | ||
| 852 | (*endnum - (i + 1))); | ||
| 853 | i--; | 814 | i--; |
| 854 | (*endnum)--; | 815 | (*endnum)--; |
| 855 | } | 816 | } |
| 856 | } | 817 | } |
| 857 | UDF_I_LENEXTENTS(inode) += | 818 | UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits; |
| 858 | numalloc << inode->i_sb->s_blocksize_bits; | ||
| 859 | } | 819 | } |
| 860 | } | 820 | } |
| 861 | } | 821 | } |
| @@ -867,119 +827,68 @@ static void udf_merge_extents(struct inode *inode, | |||
| 867 | int i; | 827 | int i; |
| 868 | 828 | ||
| 869 | for (i = 0; i < (*endnum - 1); i++) { | 829 | for (i = 0; i < (*endnum - 1); i++) { |
| 870 | if ((laarr[i].extLength >> 30) == | 830 | if ((laarr[i].extLength >> 30) == (laarr[i + 1].extLength >> 30)) { |
| 871 | (laarr[i + 1].extLength >> 30)) { | 831 | if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) || |
| 872 | if (((laarr[i].extLength >> 30) == | 832 | ((laarr[i + 1].extLocation.logicalBlockNum - laarr[i].extLocation.logicalBlockNum) == |
| 873 | (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) | ||
| 874 | || | ||
| 875 | ((laarr[i + 1].extLocation.logicalBlockNum - | ||
| 876 | laarr[i].extLocation.logicalBlockNum) == | ||
| 877 | (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + | 833 | (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 878 | inode->i_sb->s_blocksize - | 834 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits))) { |
| 879 | 1) >> inode->i_sb->s_blocksize_bits))) { | 835 | if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 880 | if (((laarr[i]. | 836 | (laarr[i + 1].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 881 | extLength & UDF_EXTENT_LENGTH_MASK) + | 837 | inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK) { |
| 882 | (laarr[i + 1]. | 838 | laarr[i + 1].extLength = (laarr[i + 1].extLength - |
| 883 | extLength & UDF_EXTENT_LENGTH_MASK) + | 839 | (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 884 | inode->i_sb->s_blocksize - | 840 | UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize - 1); |
| 885 | 1) & ~UDF_EXTENT_LENGTH_MASK) { | 841 | laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) + |
| 886 | laarr[i + 1].extLength = | 842 | (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize; |
| 887 | (laarr[i + 1].extLength - | 843 | laarr[i + 1].extLocation.logicalBlockNum = |
| 888 | (laarr[i]. | 844 | laarr[i].extLocation.logicalBlockNum + |
| 889 | extLength & | 845 | ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) >> |
| 890 | UDF_EXTENT_LENGTH_MASK) + | 846 | inode->i_sb->s_blocksize_bits); |
| 891 | UDF_EXTENT_LENGTH_MASK) & ~(inode-> | ||
| 892 | i_sb-> | ||
| 893 | s_blocksize | ||
| 894 | - 1); | ||
| 895 | laarr[i].extLength = | ||
| 896 | (laarr[i]. | ||
| 897 | extLength & UDF_EXTENT_FLAG_MASK) + | ||
| 898 | (UDF_EXTENT_LENGTH_MASK + 1) - | ||
| 899 | inode->i_sb->s_blocksize; | ||
| 900 | laarr[i + | ||
| 901 | 1].extLocation.logicalBlockNum = | ||
| 902 | laarr[i].extLocation. | ||
| 903 | logicalBlockNum + | ||
| 904 | ((laarr[i]. | ||
| 905 | extLength & | ||
| 906 | UDF_EXTENT_LENGTH_MASK) >> inode-> | ||
| 907 | i_sb->s_blocksize_bits); | ||
| 908 | } else { | 847 | } else { |
| 909 | laarr[i].extLength = | 848 | laarr[i].extLength = laarr[i + 1].extLength + |
| 910 | laarr[i + 1].extLength + | 849 | (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 911 | (((laarr[i]. | 850 | inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize - 1)); |
| 912 | extLength & | ||
| 913 | UDF_EXTENT_LENGTH_MASK) + | ||
| 914 | inode->i_sb->s_blocksize - | ||
| 915 | 1) & ~(inode->i_sb->s_blocksize - | ||
| 916 | 1)); | ||
| 917 | if (*endnum > (i + 2)) | 851 | if (*endnum > (i + 2)) |
| 918 | memmove(&laarr[i + 1], | 852 | memmove(&laarr[i + 1], &laarr[i + 2], |
| 919 | &laarr[i + 2], | 853 | sizeof(long_ad) * (*endnum - (i + 2))); |
| 920 | sizeof(long_ad) * | ||
| 921 | (*endnum - (i + 2))); | ||
| 922 | i--; | 854 | i--; |
| 923 | (*endnum)--; | 855 | (*endnum)--; |
| 924 | } | 856 | } |
| 925 | } | 857 | } |
| 926 | } else | 858 | } else if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) && |
| 927 | if (((laarr[i].extLength >> 30) == | 859 | ((laarr[i + 1].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))) { |
| 928 | (EXT_NOT_RECORDED_ALLOCATED >> 30)) | 860 | udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0, |
| 929 | && ((laarr[i + 1].extLength >> 30) == | 861 | ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 930 | (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))) { | 862 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits); |
| 931 | udf_free_blocks(inode->i_sb, inode, | ||
| 932 | laarr[i].extLocation, 0, | ||
| 933 | ((laarr[i]. | ||
| 934 | extLength & UDF_EXTENT_LENGTH_MASK) + | ||
| 935 | inode->i_sb->s_blocksize - | ||
| 936 | 1) >> inode->i_sb->s_blocksize_bits); | ||
| 937 | laarr[i].extLocation.logicalBlockNum = 0; | 863 | laarr[i].extLocation.logicalBlockNum = 0; |
| 938 | laarr[i].extLocation.partitionReferenceNum = 0; | 864 | laarr[i].extLocation.partitionReferenceNum = 0; |
| 939 | 865 | ||
| 940 | if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + | 866 | if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 941 | (laarr[i + 1].extLength & UDF_EXTENT_LENGTH_MASK) + | 867 | (laarr[i + 1].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 942 | inode->i_sb->s_blocksize - | 868 | inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK) { |
| 943 | 1) & ~UDF_EXTENT_LENGTH_MASK) { | 869 | laarr[i + 1].extLength = (laarr[i + 1].extLength - |
| 944 | laarr[i + 1].extLength = | 870 | (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 945 | (laarr[i + 1].extLength - | 871 | UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize - 1); |
| 946 | (laarr[i]. | 872 | laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) + |
| 947 | extLength & UDF_EXTENT_LENGTH_MASK) + | 873 | (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize; |
| 948 | UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb-> | ||
| 949 | s_blocksize - | ||
| 950 | 1); | ||
| 951 | laarr[i].extLength = | ||
| 952 | (laarr[i]. | ||
| 953 | extLength & UDF_EXTENT_FLAG_MASK) + | ||
| 954 | (UDF_EXTENT_LENGTH_MASK + 1) - | ||
| 955 | inode->i_sb->s_blocksize; | ||
| 956 | } else { | 874 | } else { |
| 957 | laarr[i].extLength = laarr[i + 1].extLength + | 875 | laarr[i].extLength = laarr[i + 1].extLength + |
| 958 | (((laarr[i]. | 876 | (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 959 | extLength & UDF_EXTENT_LENGTH_MASK) + | 877 | inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize - 1)); |
| 960 | inode->i_sb->s_blocksize - | ||
| 961 | 1) & ~(inode->i_sb->s_blocksize - 1)); | ||
| 962 | if (*endnum > (i + 2)) | 878 | if (*endnum > (i + 2)) |
| 963 | memmove(&laarr[i + 1], &laarr[i + 2], | 879 | memmove(&laarr[i + 1], &laarr[i + 2], |
| 964 | sizeof(long_ad) * (*endnum - | 880 | sizeof(long_ad) * (*endnum - (i + 2))); |
| 965 | (i + 2))); | ||
| 966 | i--; | 881 | i--; |
| 967 | (*endnum)--; | 882 | (*endnum)--; |
| 968 | } | 883 | } |
| 969 | } else if ((laarr[i].extLength >> 30) == | 884 | } else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
| 970 | (EXT_NOT_RECORDED_ALLOCATED >> 30)) { | 885 | udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0, |
| 971 | udf_free_blocks(inode->i_sb, inode, | 886 | ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) + |
| 972 | laarr[i].extLocation, 0, | 887 | inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits); |
| 973 | ((laarr[i]. | ||
| 974 | extLength & UDF_EXTENT_LENGTH_MASK) + | ||
| 975 | inode->i_sb->s_blocksize - | ||
| 976 | 1) >> inode->i_sb->s_blocksize_bits); | ||
| 977 | laarr[i].extLocation.logicalBlockNum = 0; | 888 | laarr[i].extLocation.logicalBlockNum = 0; |
| 978 | laarr[i].extLocation.partitionReferenceNum = 0; | 889 | laarr[i].extLocation.partitionReferenceNum = 0; |
| 979 | laarr[i].extLength = | 890 | laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) | |
| 980 | (laarr[i]. | 891 | EXT_NOT_RECORDED_NOT_ALLOCATED; |
| 981 | extLength & UDF_EXTENT_LENGTH_MASK) | | ||
| 982 | EXT_NOT_RECORDED_NOT_ALLOCATED; | ||
| 983 | } | 892 | } |
| 984 | } | 893 | } |
| 985 | } | 894 | } |
| @@ -1025,10 +934,13 @@ struct buffer_head *udf_bread(struct inode *inode, int block, | |||
| 1025 | 934 | ||
| 1026 | if (buffer_uptodate(bh)) | 935 | if (buffer_uptodate(bh)) |
| 1027 | return bh; | 936 | return bh; |
| 937 | |||
| 1028 | ll_rw_block(READ, 1, &bh); | 938 | ll_rw_block(READ, 1, &bh); |
| 939 | |||
| 1029 | wait_on_buffer(bh); | 940 | wait_on_buffer(bh); |
| 1030 | if (buffer_uptodate(bh)) | 941 | if (buffer_uptodate(bh)) |
| 1031 | return bh; | 942 | return bh; |
| 943 | |||
| 1032 | brelse(bh); | 944 | brelse(bh); |
| 1033 | *err = -EIO; | 945 | *err = -EIO; |
| 1034 | return NULL; | 946 | return NULL; |
| @@ -1047,26 +959,24 @@ void udf_truncate(struct inode *inode) | |||
| 1047 | 959 | ||
| 1048 | lock_kernel(); | 960 | lock_kernel(); |
| 1049 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) { | 961 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) { |
| 1050 | if (inode->i_sb->s_blocksize < | 962 | if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + |
| 1051 | (udf_file_entry_alloc_offset(inode) + inode->i_size)) { | 963 | inode->i_size)) { |
| 1052 | udf_expand_file_adinicb(inode, inode->i_size, &err); | 964 | udf_expand_file_adinicb(inode, inode->i_size, &err); |
| 1053 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) { | 965 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) { |
| 1054 | inode->i_size = UDF_I_LENALLOC(inode); | 966 | inode->i_size = UDF_I_LENALLOC(inode); |
| 1055 | unlock_kernel(); | 967 | unlock_kernel(); |
| 1056 | return; | 968 | return; |
| 1057 | } else | 969 | } else { |
| 1058 | udf_truncate_extents(inode); | 970 | udf_truncate_extents(inode); |
| 971 | } | ||
| 1059 | } else { | 972 | } else { |
| 1060 | offset = inode->i_size & (inode->i_sb->s_blocksize - 1); | 973 | offset = inode->i_size & (inode->i_sb->s_blocksize - 1); |
| 1061 | memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + | 974 | memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset, 0x00, |
| 1062 | offset, 0x00, | 975 | inode->i_sb->s_blocksize - offset - udf_file_entry_alloc_offset(inode)); |
| 1063 | inode->i_sb->s_blocksize - offset - | ||
| 1064 | udf_file_entry_alloc_offset(inode)); | ||
| 1065 | UDF_I_LENALLOC(inode) = inode->i_size; | 976 | UDF_I_LENALLOC(inode) = inode->i_size; |
| 1066 | } | 977 | } |
| 1067 | } else { | 978 | } else { |
| 1068 | block_truncate_page(inode->i_mapping, inode->i_size, | 979 | block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block); |
| 1069 | udf_get_block); | ||
| 1070 | udf_truncate_extents(inode); | 980 | udf_truncate_extents(inode); |
| 1071 | } | 981 | } |
| 1072 | 982 | ||
| @@ -1097,7 +1007,6 @@ static void __udf_read_inode(struct inode *inode) | |||
| 1097 | * i_op = NULL; | 1007 | * i_op = NULL; |
| 1098 | */ | 1008 | */ |
| 1099 | bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident); | 1009 | bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident); |
| 1100 | |||
| 1101 | if (!bh) { | 1010 | if (!bh) { |
| 1102 | printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n", | 1011 | printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n", |
| 1103 | inode->i_ino); | 1012 | inode->i_ino); |
| @@ -1107,8 +1016,7 @@ static void __udf_read_inode(struct inode *inode) | |||
| 1107 | 1016 | ||
| 1108 | if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE && | 1017 | if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE && |
| 1109 | ident != TAG_IDENT_USE) { | 1018 | ident != TAG_IDENT_USE) { |
| 1110 | printk(KERN_ERR | 1019 | printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed ident=%d\n", |
| 1111 | "udf: udf_read_inode(ino %ld) failed ident=%d\n", | ||
| 1112 | inode->i_ino, ident); | 1020 | inode->i_ino, ident); |
| 1113 | brelse(bh); | 1021 | brelse(bh); |
| 1114 | make_bad_inode(inode); | 1022 | make_bad_inode(inode); |
| @@ -1121,9 +1029,7 @@ static void __udf_read_inode(struct inode *inode) | |||
| 1121 | struct buffer_head *ibh = NULL, *nbh = NULL; | 1029 | struct buffer_head *ibh = NULL, *nbh = NULL; |
| 1122 | struct indirectEntry *ie; | 1030 | struct indirectEntry *ie; |
| 1123 | 1031 | ||
| 1124 | ibh = | 1032 | ibh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 1, &ident); |
| 1125 | udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 1, | ||
| 1126 | &ident); | ||
| 1127 | if (ident == TAG_IDENT_IE) { | 1033 | if (ident == TAG_IDENT_IE) { |
| 1128 | if (ibh) { | 1034 | if (ibh) { |
| 1129 | kernel_lb_addr loc; | 1035 | kernel_lb_addr loc; |
| @@ -1132,13 +1038,10 @@ static void __udf_read_inode(struct inode *inode) | |||
| 1132 | loc = lelb_to_cpu(ie->indirectICB.extLocation); | 1038 | loc = lelb_to_cpu(ie->indirectICB.extLocation); |
| 1133 | 1039 | ||
| 1134 | if (ie->indirectICB.extLength && | 1040 | if (ie->indirectICB.extLength && |
| 1135 | (nbh = | 1041 | (nbh = udf_read_ptagged(inode->i_sb, loc, 0, &ident))) { |
| 1136 | udf_read_ptagged(inode->i_sb, loc, 0, | 1042 | if (ident == TAG_IDENT_FE || |
| 1137 | &ident))) { | 1043 | ident == TAG_IDENT_EFE) { |
| 1138 | if (ident == TAG_IDENT_FE | 1044 | memcpy(&UDF_I_LOCATION(inode), &loc, |
| 1139 | || ident == TAG_IDENT_EFE) { | ||
| 1140 | memcpy(&UDF_I_LOCATION(inode), | ||
| 1141 | &loc, | ||
| 1142 | sizeof(kernel_lb_addr)); | 1045 | sizeof(kernel_lb_addr)); |
| 1143 | brelse(bh); | 1046 | brelse(bh); |
| 1144 | brelse(ibh); | 1047 | brelse(ibh); |
| @@ -1149,11 +1052,13 @@ static void __udf_read_inode(struct inode *inode) | |||
| 1149 | brelse(nbh); | 1052 | brelse(nbh); |
| 1150 | brelse(ibh); | 1053 | brelse(ibh); |
| 1151 | } | 1054 | } |
| 1152 | } else | 1055 | } else { |
| 1153 | brelse(ibh); | 1056 | brelse(ibh); |
| 1057 | } | ||
| 1154 | } | 1058 | } |
| 1155 | } else | 1059 | } else { |
| 1156 | brelse(ibh); | 1060 | brelse(ibh); |
| 1061 | } | ||
| 1157 | } else if (le16_to_cpu(fe->icbTag.strategyType) != 4) { | 1062 | } else if (le16_to_cpu(fe->icbTag.strategyType) != 4) { |
| 1158 | printk(KERN_ERR "udf: unsupported strategy type: %d\n", | 1063 | printk(KERN_ERR "udf: unsupported strategy type: %d\n", |
| 1159 | le16_to_cpu(fe->icbTag.strategyType)); | 1064 | le16_to_cpu(fe->icbTag.strategyType)); |
| @@ -1179,11 +1084,10 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1179 | 1084 | ||
| 1180 | if (le16_to_cpu(fe->icbTag.strategyType) == 4) | 1085 | if (le16_to_cpu(fe->icbTag.strategyType) == 4) |
| 1181 | UDF_I_STRAT4096(inode) = 0; | 1086 | UDF_I_STRAT4096(inode) = 0; |
| 1182 | else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */ | 1087 | else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */ |
| 1183 | UDF_I_STRAT4096(inode) = 1; | 1088 | UDF_I_STRAT4096(inode) = 1; |
| 1184 | 1089 | ||
| 1185 | UDF_I_ALLOCTYPE(inode) = | 1090 | UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICBTAG_FLAG_AD_MASK; |
| 1186 | le16_to_cpu(fe->icbTag.flags) & ICBTAG_FLAG_AD_MASK; | ||
| 1187 | UDF_I_UNIQUE(inode) = 0; | 1091 | UDF_I_UNIQUE(inode) = 0; |
| 1188 | UDF_I_LENEATTR(inode) = 0; | 1092 | UDF_I_LENEATTR(inode) = 0; |
| 1189 | UDF_I_LENEXTENTS(inode) = 0; | 1093 | UDF_I_LENEXTENTS(inode) = 0; |
| @@ -1193,23 +1097,16 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1193 | if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_EFE) { | 1097 | if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_EFE) { |
| 1194 | UDF_I_EFE(inode) = 1; | 1098 | UDF_I_EFE(inode) = 1; |
| 1195 | UDF_I_USE(inode) = 0; | 1099 | UDF_I_USE(inode) = 0; |
| 1196 | if (udf_alloc_i_data | 1100 | if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry))) { |
| 1197 | (inode, | ||
| 1198 | inode->i_sb->s_blocksize - | ||
| 1199 | sizeof(struct extendedFileEntry))) { | ||
| 1200 | make_bad_inode(inode); | 1101 | make_bad_inode(inode); |
| 1201 | return; | 1102 | return; |
| 1202 | } | 1103 | } |
| 1203 | memcpy(UDF_I_DATA(inode), | 1104 | memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct extendedFileEntry), |
| 1204 | bh->b_data + sizeof(struct extendedFileEntry), | 1105 | inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry)); |
| 1205 | inode->i_sb->s_blocksize - | ||
| 1206 | sizeof(struct extendedFileEntry)); | ||
| 1207 | } else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE) { | 1106 | } else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE) { |
| 1208 | UDF_I_EFE(inode) = 0; | 1107 | UDF_I_EFE(inode) = 0; |
| 1209 | UDF_I_USE(inode) = 0; | 1108 | UDF_I_USE(inode) = 0; |
| 1210 | if (udf_alloc_i_data | 1109 | if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - sizeof(struct fileEntry))) { |
| 1211 | (inode, | ||
| 1212 | inode->i_sb->s_blocksize - sizeof(struct fileEntry))) { | ||
| 1213 | make_bad_inode(inode); | 1110 | make_bad_inode(inode); |
| 1214 | return; | 1111 | return; |
| 1215 | } | 1112 | } |
| @@ -1219,19 +1116,13 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1219 | UDF_I_EFE(inode) = 0; | 1116 | UDF_I_EFE(inode) = 0; |
| 1220 | UDF_I_USE(inode) = 1; | 1117 | UDF_I_USE(inode) = 1; |
| 1221 | UDF_I_LENALLOC(inode) = | 1118 | UDF_I_LENALLOC(inode) = |
| 1222 | le32_to_cpu(((struct unallocSpaceEntry *)bh->b_data)-> | 1119 | le32_to_cpu(((struct unallocSpaceEntry *)bh->b_data)->lengthAllocDescs); |
| 1223 | lengthAllocDescs); | 1120 | if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry))) { |
| 1224 | if (udf_alloc_i_data | ||
| 1225 | (inode, | ||
| 1226 | inode->i_sb->s_blocksize - | ||
| 1227 | sizeof(struct unallocSpaceEntry))) { | ||
| 1228 | make_bad_inode(inode); | 1121 | make_bad_inode(inode); |
| 1229 | return; | 1122 | return; |
| 1230 | } | 1123 | } |
| 1231 | memcpy(UDF_I_DATA(inode), | 1124 | memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct unallocSpaceEntry), |
| 1232 | bh->b_data + sizeof(struct unallocSpaceEntry), | 1125 | inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry)); |
| 1233 | inode->i_sb->s_blocksize - | ||
| 1234 | sizeof(struct unallocSpaceEntry)); | ||
| 1235 | return; | 1126 | return; |
| 1236 | } | 1127 | } |
| 1237 | 1128 | ||
| @@ -1257,7 +1148,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1257 | 1148 | ||
| 1258 | if (UDF_I_EFE(inode) == 0) { | 1149 | if (UDF_I_EFE(inode) == 0) { |
| 1259 | inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << | 1150 | inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << |
| 1260 | (inode->i_sb->s_blocksize_bits - 9); | 1151 | (inode->i_sb->s_blocksize_bits - 9); |
| 1261 | 1152 | ||
| 1262 | if (udf_stamp_to_time(&convtime, &convtime_usec, | 1153 | if (udf_stamp_to_time(&convtime, &convtime_usec, |
| 1263 | lets_to_cpu(fe->accessTime))) { | 1154 | lets_to_cpu(fe->accessTime))) { |
| @@ -1326,78 +1217,56 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1326 | UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID); | 1217 | UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID); |
| 1327 | UDF_I_LENEATTR(inode) = le32_to_cpu(efe->lengthExtendedAttr); | 1218 | UDF_I_LENEATTR(inode) = le32_to_cpu(efe->lengthExtendedAttr); |
| 1328 | UDF_I_LENALLOC(inode) = le32_to_cpu(efe->lengthAllocDescs); | 1219 | UDF_I_LENALLOC(inode) = le32_to_cpu(efe->lengthAllocDescs); |
| 1329 | offset = | 1220 | offset = sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode); |
| 1330 | sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode); | ||
| 1331 | } | 1221 | } |
| 1332 | 1222 | ||
| 1333 | switch (fe->icbTag.fileType) { | 1223 | switch (fe->icbTag.fileType) { |
| 1334 | case ICBTAG_FILE_TYPE_DIRECTORY: | 1224 | case ICBTAG_FILE_TYPE_DIRECTORY: |
| 1335 | { | 1225 | inode->i_op = &udf_dir_inode_operations; |
| 1336 | inode->i_op = &udf_dir_inode_operations; | 1226 | inode->i_fop = &udf_dir_operations; |
| 1337 | inode->i_fop = &udf_dir_operations; | 1227 | inode->i_mode |= S_IFDIR; |
| 1338 | inode->i_mode |= S_IFDIR; | 1228 | inc_nlink(inode); |
| 1339 | inc_nlink(inode); | 1229 | break; |
| 1340 | break; | ||
| 1341 | } | ||
| 1342 | case ICBTAG_FILE_TYPE_REALTIME: | 1230 | case ICBTAG_FILE_TYPE_REALTIME: |
| 1343 | case ICBTAG_FILE_TYPE_REGULAR: | 1231 | case ICBTAG_FILE_TYPE_REGULAR: |
| 1344 | case ICBTAG_FILE_TYPE_UNDEF: | 1232 | case ICBTAG_FILE_TYPE_UNDEF: |
| 1345 | { | 1233 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) |
| 1346 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) | 1234 | inode->i_data.a_ops = &udf_adinicb_aops; |
| 1347 | inode->i_data.a_ops = &udf_adinicb_aops; | 1235 | else |
| 1348 | else | 1236 | inode->i_data.a_ops = &udf_aops; |
| 1349 | inode->i_data.a_ops = &udf_aops; | 1237 | inode->i_op = &udf_file_inode_operations; |
| 1350 | inode->i_op = &udf_file_inode_operations; | 1238 | inode->i_fop = &udf_file_operations; |
| 1351 | inode->i_fop = &udf_file_operations; | 1239 | inode->i_mode |= S_IFREG; |
| 1352 | inode->i_mode |= S_IFREG; | 1240 | break; |
| 1353 | break; | ||
| 1354 | } | ||
| 1355 | case ICBTAG_FILE_TYPE_BLOCK: | 1241 | case ICBTAG_FILE_TYPE_BLOCK: |
| 1356 | { | 1242 | inode->i_mode |= S_IFBLK; |
| 1357 | inode->i_mode |= S_IFBLK; | 1243 | break; |
| 1358 | break; | ||
| 1359 | } | ||
| 1360 | case ICBTAG_FILE_TYPE_CHAR: | 1244 | case ICBTAG_FILE_TYPE_CHAR: |
| 1361 | { | 1245 | inode->i_mode |= S_IFCHR; |
| 1362 | inode->i_mode |= S_IFCHR; | 1246 | break; |
| 1363 | break; | ||
| 1364 | } | ||
| 1365 | case ICBTAG_FILE_TYPE_FIFO: | 1247 | case ICBTAG_FILE_TYPE_FIFO: |
| 1366 | { | 1248 | init_special_inode(inode, inode->i_mode | S_IFIFO, 0); |
| 1367 | init_special_inode(inode, inode->i_mode | S_IFIFO, 0); | 1249 | break; |
| 1368 | break; | ||
| 1369 | } | ||
| 1370 | case ICBTAG_FILE_TYPE_SOCKET: | 1250 | case ICBTAG_FILE_TYPE_SOCKET: |
| 1371 | { | 1251 | init_special_inode(inode, inode->i_mode | S_IFSOCK, 0); |
| 1372 | init_special_inode(inode, inode->i_mode | S_IFSOCK, 0); | 1252 | break; |
| 1373 | break; | ||
| 1374 | } | ||
| 1375 | case ICBTAG_FILE_TYPE_SYMLINK: | 1253 | case ICBTAG_FILE_TYPE_SYMLINK: |
| 1376 | { | 1254 | inode->i_data.a_ops = &udf_symlink_aops; |
| 1377 | inode->i_data.a_ops = &udf_symlink_aops; | 1255 | inode->i_op = &page_symlink_inode_operations; |
| 1378 | inode->i_op = &page_symlink_inode_operations; | 1256 | inode->i_mode = S_IFLNK | S_IRWXUGO; |
| 1379 | inode->i_mode = S_IFLNK | S_IRWXUGO; | 1257 | break; |
| 1380 | break; | ||
| 1381 | } | ||
| 1382 | default: | 1258 | default: |
| 1383 | { | 1259 | printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown file type=%d\n", |
| 1384 | printk(KERN_ERR | 1260 | inode->i_ino, fe->icbTag.fileType); |
| 1385 | "udf: udf_fill_inode(ino %ld) failed unknown file type=%d\n", | 1261 | make_bad_inode(inode); |
| 1386 | inode->i_ino, fe->icbTag.fileType); | 1262 | return; |
| 1387 | make_bad_inode(inode); | ||
| 1388 | return; | ||
| 1389 | } | ||
| 1390 | } | 1263 | } |
| 1391 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { | 1264 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { |
| 1392 | struct deviceSpec *dsea = (struct deviceSpec *) | 1265 | struct deviceSpec *dsea = (struct deviceSpec *)udf_get_extendedattr(inode, 12, 1); |
| 1393 | udf_get_extendedattr(inode, 12, 1); | ||
| 1394 | |||
| 1395 | if (dsea) { | 1266 | if (dsea) { |
| 1396 | init_special_inode(inode, inode->i_mode, | 1267 | init_special_inode(inode, inode->i_mode, |
| 1397 | MKDEV(le32_to_cpu | 1268 | MKDEV(le32_to_cpu(dsea->majorDeviceIdent), |
| 1398 | (dsea->majorDeviceIdent), | 1269 | le32_to_cpu(dsea->minorDeviceIdent))); |
| 1399 | le32_to_cpu(dsea-> | ||
| 1400 | minorDeviceIdent))); | ||
| 1401 | /* Developer ID ??? */ | 1270 | /* Developer ID ??? */ |
| 1402 | } else { | 1271 | } else { |
| 1403 | make_bad_inode(inode); | 1272 | make_bad_inode(inode); |
| @@ -1410,8 +1279,7 @@ static int udf_alloc_i_data(struct inode *inode, size_t size) | |||
| 1410 | UDF_I_DATA(inode) = kmalloc(size, GFP_KERNEL); | 1279 | UDF_I_DATA(inode) = kmalloc(size, GFP_KERNEL); |
| 1411 | 1280 | ||
| 1412 | if (!UDF_I_DATA(inode)) { | 1281 | if (!UDF_I_DATA(inode)) { |
| 1413 | printk(KERN_ERR | 1282 | printk(KERN_ERR "udf:udf_alloc_i_data (ino %ld) no free memory\n", |
| 1414 | "udf:udf_alloc_i_data (ino %ld) no free memory\n", | ||
| 1415 | inode->i_ino); | 1283 | inode->i_ino); |
| 1416 | return -ENOMEM; | 1284 | return -ENOMEM; |
| 1417 | } | 1285 | } |
| @@ -1428,12 +1296,12 @@ static mode_t udf_convert_permissions(struct fileEntry *fe) | |||
| 1428 | permissions = le32_to_cpu(fe->permissions); | 1296 | permissions = le32_to_cpu(fe->permissions); |
| 1429 | flags = le16_to_cpu(fe->icbTag.flags); | 1297 | flags = le16_to_cpu(fe->icbTag.flags); |
| 1430 | 1298 | ||
| 1431 | mode = ((permissions) & S_IRWXO) | | 1299 | mode = (( permissions ) & S_IRWXO) | |
| 1432 | ((permissions >> 2) & S_IRWXG) | | 1300 | (( permissions >> 2 ) & S_IRWXG) | |
| 1433 | ((permissions >> 4) & S_IRWXU) | | 1301 | (( permissions >> 4 ) & S_IRWXU) | |
| 1434 | ((flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) | | 1302 | (( flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) | |
| 1435 | ((flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) | | 1303 | (( flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) | |
| 1436 | ((flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0); | 1304 | (( flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0); |
| 1437 | 1305 | ||
| 1438 | return mode; | 1306 | return mode; |
| 1439 | } | 1307 | } |
| @@ -1456,9 +1324,11 @@ static mode_t udf_convert_permissions(struct fileEntry *fe) | |||
| 1456 | int udf_write_inode(struct inode *inode, int sync) | 1324 | int udf_write_inode(struct inode *inode, int sync) |
| 1457 | { | 1325 | { |
| 1458 | int ret; | 1326 | int ret; |
| 1327 | |||
| 1459 | lock_kernel(); | 1328 | lock_kernel(); |
| 1460 | ret = udf_update_inode(inode, sync); | 1329 | ret = udf_update_inode(inode, sync); |
| 1461 | unlock_kernel(); | 1330 | unlock_kernel(); |
| 1331 | |||
| 1462 | return ret; | 1332 | return ret; |
| 1463 | } | 1333 | } |
| 1464 | 1334 | ||
| @@ -1479,10 +1349,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1479 | kernel_timestamp cpu_time; | 1349 | kernel_timestamp cpu_time; |
| 1480 | int err = 0; | 1350 | int err = 0; |
| 1481 | 1351 | ||
| 1482 | bh = udf_tread(inode->i_sb, | 1352 | bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0)); |
| 1483 | udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), | ||
| 1484 | 0)); | ||
| 1485 | |||
| 1486 | if (!bh) { | 1353 | if (!bh) { |
| 1487 | udf_debug("bread failure\n"); | 1354 | udf_debug("bread failure\n"); |
| 1488 | return -EIO; | 1355 | return -EIO; |
| @@ -1495,27 +1362,21 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1495 | 1362 | ||
| 1496 | if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE) { | 1363 | if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE) { |
| 1497 | struct unallocSpaceEntry *use = | 1364 | struct unallocSpaceEntry *use = |
| 1498 | (struct unallocSpaceEntry *)bh->b_data; | 1365 | (struct unallocSpaceEntry *)bh->b_data; |
| 1499 | 1366 | ||
| 1500 | use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode)); | 1367 | use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode)); |
| 1501 | memcpy(bh->b_data + sizeof(struct unallocSpaceEntry), | 1368 | memcpy(bh->b_data + sizeof(struct unallocSpaceEntry), UDF_I_DATA(inode), |
| 1502 | UDF_I_DATA(inode), | 1369 | inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry)); |
| 1503 | inode->i_sb->s_blocksize - | 1370 | crclen = sizeof(struct unallocSpaceEntry) + UDF_I_LENALLOC(inode) - sizeof(tag); |
| 1504 | sizeof(struct unallocSpaceEntry)); | 1371 | use->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); |
| 1505 | crclen = | ||
| 1506 | sizeof(struct unallocSpaceEntry) + UDF_I_LENALLOC(inode) - | ||
| 1507 | sizeof(tag); | ||
| 1508 | use->descTag.tagLocation = | ||
| 1509 | cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); | ||
| 1510 | use->descTag.descCRCLength = cpu_to_le16(crclen); | 1372 | use->descTag.descCRCLength = cpu_to_le16(crclen); |
| 1511 | use->descTag.descCRC = | 1373 | use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0)); |
| 1512 | cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0)); | ||
| 1513 | 1374 | ||
| 1514 | use->descTag.tagChecksum = 0; | 1375 | use->descTag.tagChecksum = 0; |
| 1515 | for (i = 0; i < 16; i++) | 1376 | for (i = 0; i < 16; i++) { |
| 1516 | if (i != 4) | 1377 | if (i != 4) |
| 1517 | use->descTag.tagChecksum += | 1378 | use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i]; |
| 1518 | ((uint8_t *) & (use->descTag))[i]; | 1379 | } |
| 1519 | 1380 | ||
| 1520 | mark_buffer_dirty(bh); | 1381 | mark_buffer_dirty(bh); |
| 1521 | brelse(bh); | 1382 | brelse(bh); |
| @@ -1532,13 +1393,14 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1532 | else | 1393 | else |
| 1533 | fe->gid = cpu_to_le32(inode->i_gid); | 1394 | fe->gid = cpu_to_le32(inode->i_gid); |
| 1534 | 1395 | ||
| 1535 | udfperms = ((inode->i_mode & S_IRWXO)) | | 1396 | udfperms = ((inode->i_mode & S_IRWXO) ) | |
| 1536 | ((inode->i_mode & S_IRWXG) << 2) | ((inode->i_mode & S_IRWXU) << 4); | 1397 | ((inode->i_mode & S_IRWXG) << 2) | |
| 1398 | ((inode->i_mode & S_IRWXU) << 4); | ||
| 1537 | 1399 | ||
| 1538 | udfperms |= (le32_to_cpu(fe->permissions) & | 1400 | udfperms |= (le32_to_cpu(fe->permissions) & |
| 1539 | (FE_PERM_O_DELETE | FE_PERM_O_CHATTR | | 1401 | (FE_PERM_O_DELETE | FE_PERM_O_CHATTR | |
| 1540 | FE_PERM_G_DELETE | FE_PERM_G_CHATTR | | 1402 | FE_PERM_G_DELETE | FE_PERM_G_CHATTR | |
| 1541 | FE_PERM_U_DELETE | FE_PERM_U_CHATTR)); | 1403 | FE_PERM_U_DELETE | FE_PERM_U_CHATTR)); |
| 1542 | fe->permissions = cpu_to_le32(udfperms); | 1404 | fe->permissions = cpu_to_le32(udfperms); |
| 1543 | 1405 | ||
| 1544 | if (S_ISDIR(inode->i_mode)) | 1406 | if (S_ISDIR(inode->i_mode)) |
| @@ -1550,22 +1412,20 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1550 | 1412 | ||
| 1551 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { | 1413 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { |
| 1552 | regid *eid; | 1414 | regid *eid; |
| 1553 | struct deviceSpec *dsea = (struct deviceSpec *) | 1415 | struct deviceSpec *dsea = |
| 1554 | udf_get_extendedattr(inode, 12, 1); | 1416 | (struct deviceSpec *)udf_get_extendedattr(inode, 12, 1); |
| 1555 | |||
| 1556 | if (!dsea) { | 1417 | if (!dsea) { |
| 1557 | dsea = (struct deviceSpec *) | 1418 | dsea = (struct deviceSpec *) |
| 1558 | udf_add_extendedattr(inode, | 1419 | udf_add_extendedattr(inode, |
| 1559 | sizeof(struct deviceSpec) + | 1420 | sizeof(struct deviceSpec) + |
| 1560 | sizeof(regid), 12, 0x3); | 1421 | sizeof(regid), 12, 0x3); |
| 1561 | dsea->attrType = cpu_to_le32(12); | 1422 | dsea->attrType = cpu_to_le32(12); |
| 1562 | dsea->attrSubtype = 1; | 1423 | dsea->attrSubtype = 1; |
| 1563 | dsea->attrLength = | 1424 | dsea->attrLength = cpu_to_le32(sizeof(struct deviceSpec) + |
| 1564 | cpu_to_le32(sizeof(struct deviceSpec) + | 1425 | sizeof(regid)); |
| 1565 | sizeof(regid)); | ||
| 1566 | dsea->impUseLength = cpu_to_le32(sizeof(regid)); | 1426 | dsea->impUseLength = cpu_to_le32(sizeof(regid)); |
| 1567 | } | 1427 | } |
| 1568 | eid = (regid *) dsea->impUse; | 1428 | eid = (regid *)dsea->impUse; |
| 1569 | memset(eid, 0, sizeof(regid)); | 1429 | memset(eid, 0, sizeof(regid)); |
| 1570 | strcpy(eid->ident, UDF_ID_DEVELOPER); | 1430 | strcpy(eid->ident, UDF_ID_DEVELOPER); |
| 1571 | eid->identSuffix[0] = UDF_OS_CLASS_UNIX; | 1431 | eid->identSuffix[0] = UDF_OS_CLASS_UNIX; |
| @@ -1577,10 +1437,9 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1577 | if (UDF_I_EFE(inode) == 0) { | 1437 | if (UDF_I_EFE(inode) == 0) { |
| 1578 | memcpy(bh->b_data + sizeof(struct fileEntry), UDF_I_DATA(inode), | 1438 | memcpy(bh->b_data + sizeof(struct fileEntry), UDF_I_DATA(inode), |
| 1579 | inode->i_sb->s_blocksize - sizeof(struct fileEntry)); | 1439 | inode->i_sb->s_blocksize - sizeof(struct fileEntry)); |
| 1580 | fe->logicalBlocksRecorded = | 1440 | fe->logicalBlocksRecorded = cpu_to_le64( |
| 1581 | cpu_to_le64((inode->i_blocks + | 1441 | (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >> |
| 1582 | (1 << (inode->i_sb->s_blocksize_bits - 9)) - | 1442 | (inode->i_sb->s_blocksize_bits - 9)); |
| 1583 | 1) >> (inode->i_sb->s_blocksize_bits - 9)); | ||
| 1584 | 1443 | ||
| 1585 | if (udf_time_to_stamp(&cpu_time, inode->i_atime)) | 1444 | if (udf_time_to_stamp(&cpu_time, inode->i_atime)) |
| 1586 | fe->accessTime = cpu_to_lets(cpu_time); | 1445 | fe->accessTime = cpu_to_lets(cpu_time); |
| @@ -1598,19 +1457,12 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1598 | fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE); | 1457 | fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE); |
| 1599 | crclen = sizeof(struct fileEntry); | 1458 | crclen = sizeof(struct fileEntry); |
| 1600 | } else { | 1459 | } else { |
| 1601 | memcpy(bh->b_data + sizeof(struct extendedFileEntry), | 1460 | memcpy(bh->b_data + sizeof(struct extendedFileEntry), UDF_I_DATA(inode), |
| 1602 | UDF_I_DATA(inode), | 1461 | inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry)); |
| 1603 | inode->i_sb->s_blocksize - | ||
| 1604 | sizeof(struct extendedFileEntry)); | ||
| 1605 | efe->objectSize = cpu_to_le64(inode->i_size); | 1462 | efe->objectSize = cpu_to_le64(inode->i_size); |
| 1606 | efe->logicalBlocksRecorded = cpu_to_le64((inode->i_blocks + | 1463 | efe->logicalBlocksRecorded = cpu_to_le64( |
| 1607 | (1 << | 1464 | (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >> |
| 1608 | (inode->i_sb-> | 1465 | (inode->i_sb->s_blocksize_bits - 9)); |
| 1609 | s_blocksize_bits - | ||
| 1610 | 9)) - | ||
| 1611 | 1) >> (inode->i_sb-> | ||
| 1612 | s_blocksize_bits | ||
| 1613 | - 9)); | ||
| 1614 | 1466 | ||
| 1615 | if (UDF_I_CRTIME(inode).tv_sec > inode->i_atime.tv_sec || | 1467 | if (UDF_I_CRTIME(inode).tv_sec > inode->i_atime.tv_sec || |
| 1616 | (UDF_I_CRTIME(inode).tv_sec == inode->i_atime.tv_sec && | 1468 | (UDF_I_CRTIME(inode).tv_sec == inode->i_atime.tv_sec && |
| @@ -1671,13 +1523,13 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1671 | else if (S_ISSOCK(inode->i_mode)) | 1523 | else if (S_ISSOCK(inode->i_mode)) |
| 1672 | fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET; | 1524 | fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET; |
| 1673 | 1525 | ||
| 1674 | icbflags = UDF_I_ALLOCTYPE(inode) | | 1526 | icbflags = UDF_I_ALLOCTYPE(inode) | |
| 1675 | ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) | | 1527 | ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) | |
| 1676 | ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) | | 1528 | ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) | |
| 1677 | ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) | | 1529 | ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) | |
| 1678 | (le16_to_cpu(fe->icbTag.flags) & | 1530 | (le16_to_cpu(fe->icbTag.flags) & |
| 1679 | ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID | | 1531 | ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID | |
| 1680 | ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY)); | 1532 | ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY)); |
| 1681 | 1533 | ||
| 1682 | fe->icbTag.flags = cpu_to_le16(icbflags); | 1534 | fe->icbTag.flags = cpu_to_le16(icbflags); |
| 1683 | if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200) | 1535 | if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200) |
| @@ -1685,18 +1537,16 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1685 | else | 1537 | else |
| 1686 | fe->descTag.descVersion = cpu_to_le16(2); | 1538 | fe->descTag.descVersion = cpu_to_le16(2); |
| 1687 | fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb)); | 1539 | fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb)); |
| 1688 | fe->descTag.tagLocation = | 1540 | fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); |
| 1689 | cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); | ||
| 1690 | crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag); | 1541 | crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag); |
| 1691 | fe->descTag.descCRCLength = cpu_to_le16(crclen); | 1542 | fe->descTag.descCRCLength = cpu_to_le16(crclen); |
| 1692 | fe->descTag.descCRC = | 1543 | fe->descTag.descCRC = cpu_to_le16(udf_crc((char *)fe + sizeof(tag), crclen, 0)); |
| 1693 | cpu_to_le16(udf_crc((char *)fe + sizeof(tag), crclen, 0)); | ||
| 1694 | 1544 | ||
| 1695 | fe->descTag.tagChecksum = 0; | 1545 | fe->descTag.tagChecksum = 0; |
| 1696 | for (i = 0; i < 16; i++) | 1546 | for (i = 0; i < 16; i++) { |
| 1697 | if (i != 4) | 1547 | if (i != 4) |
| 1698 | fe->descTag.tagChecksum += | 1548 | fe->descTag.tagChecksum += ((uint8_t *)&(fe->descTag))[i]; |
| 1699 | ((uint8_t *) & (fe->descTag))[i]; | 1549 | } |
| 1700 | 1550 | ||
| 1701 | /* write the data blocks */ | 1551 | /* write the data blocks */ |
| 1702 | mark_buffer_dirty(bh); | 1552 | mark_buffer_dirty(bh); |
| @@ -1709,6 +1559,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1709 | } | 1559 | } |
| 1710 | } | 1560 | } |
| 1711 | brelse(bh); | 1561 | brelse(bh); |
| 1562 | |||
| 1712 | return err; | 1563 | return err; |
| 1713 | } | 1564 | } |
| 1714 | 1565 | ||
| @@ -1729,8 +1580,7 @@ struct inode *udf_iget(struct super_block *sb, kernel_lb_addr ino) | |||
| 1729 | if (is_bad_inode(inode)) | 1580 | if (is_bad_inode(inode)) |
| 1730 | goto out_iput; | 1581 | goto out_iput; |
| 1731 | 1582 | ||
| 1732 | if (ino.logicalBlockNum >= | 1583 | if (ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) { |
| 1733 | UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) { | ||
| 1734 | udf_debug("block=%d, partition=%d out of range\n", | 1584 | udf_debug("block=%d, partition=%d out of range\n", |
| 1735 | ino.logicalBlockNum, ino.partitionReferenceNum); | 1585 | ino.logicalBlockNum, ino.partitionReferenceNum); |
| 1736 | make_bad_inode(inode); | 1586 | make_bad_inode(inode); |
| @@ -1739,7 +1589,7 @@ struct inode *udf_iget(struct super_block *sb, kernel_lb_addr ino) | |||
| 1739 | 1589 | ||
| 1740 | return inode; | 1590 | return inode; |
| 1741 | 1591 | ||
| 1742 | out_iput: | 1592 | out_iput: |
| 1743 | iput(inode); | 1593 | iput(inode); |
| 1744 | return NULL; | 1594 | return NULL; |
| 1745 | } | 1595 | } |
| @@ -1755,9 +1605,7 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1755 | uint8_t *ptr; | 1605 | uint8_t *ptr; |
| 1756 | 1606 | ||
| 1757 | if (!epos->bh) | 1607 | if (!epos->bh) |
| 1758 | ptr = | 1608 | ptr = UDF_I_DATA(inode) + epos->offset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode); |
| 1759 | UDF_I_DATA(inode) + epos->offset - | ||
| 1760 | udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode); | ||
| 1761 | else | 1609 | else |
| 1762 | ptr = epos->bh->b_data + epos->offset; | 1610 | ptr = epos->bh->b_data + epos->offset; |
| 1763 | 1611 | ||
| @@ -1774,18 +1622,13 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1774 | int err, loffset; | 1622 | int err, loffset; |
| 1775 | kernel_lb_addr obloc = epos->block; | 1623 | kernel_lb_addr obloc = epos->block; |
| 1776 | 1624 | ||
| 1777 | if (! | 1625 | if (!(epos->block.logicalBlockNum = udf_new_block(inode->i_sb, NULL, |
| 1778 | (epos->block.logicalBlockNum = | 1626 | obloc.partitionReferenceNum, |
| 1779 | udf_new_block(inode->i_sb, NULL, | 1627 | obloc.logicalBlockNum, &err))) { |
| 1780 | obloc.partitionReferenceNum, | ||
| 1781 | obloc.logicalBlockNum, &err))) { | ||
| 1782 | return -1; | 1628 | return -1; |
| 1783 | } | 1629 | } |
| 1784 | if (! | 1630 | if (!(nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb, |
| 1785 | (nbh = | 1631 | epos->block, 0)))) { |
| 1786 | udf_tgetblk(inode->i_sb, | ||
| 1787 | udf_get_lb_pblock(inode->i_sb, epos->block, | ||
| 1788 | 0)))) { | ||
| 1789 | return -1; | 1632 | return -1; |
| 1790 | } | 1633 | } |
| 1791 | lock_buffer(nbh); | 1634 | lock_buffer(nbh); |
| @@ -1796,8 +1639,7 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1796 | 1639 | ||
| 1797 | aed = (struct allocExtDesc *)(nbh->b_data); | 1640 | aed = (struct allocExtDesc *)(nbh->b_data); |
| 1798 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) | 1641 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) |
| 1799 | aed->previousAllocExtLocation = | 1642 | aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum); |
| 1800 | cpu_to_le32(obloc.logicalBlockNum); | ||
| 1801 | if (epos->offset + adsize > inode->i_sb->s_blocksize) { | 1643 | if (epos->offset + adsize > inode->i_sb->s_blocksize) { |
| 1802 | loffset = epos->offset; | 1644 | loffset = epos->offset; |
| 1803 | aed->lengthAllocDescs = cpu_to_le32(adsize); | 1645 | aed->lengthAllocDescs = cpu_to_le32(adsize); |
| @@ -1814,9 +1656,7 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1814 | if (epos->bh) { | 1656 | if (epos->bh) { |
| 1815 | aed = (struct allocExtDesc *)epos->bh->b_data; | 1657 | aed = (struct allocExtDesc *)epos->bh->b_data; |
| 1816 | aed->lengthAllocDescs = | 1658 | aed->lengthAllocDescs = |
| 1817 | cpu_to_le32(le32_to_cpu | 1659 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); |
| 1818 | (aed->lengthAllocDescs) + | ||
| 1819 | adsize); | ||
| 1820 | } else { | 1660 | } else { |
| 1821 | UDF_I_LENALLOC(inode) += adsize; | 1661 | UDF_I_LENALLOC(inode) += adsize; |
| 1822 | mark_inode_dirty(inode); | 1662 | mark_inode_dirty(inode); |
| @@ -1830,37 +1670,30 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1830 | epos->block.logicalBlockNum, sizeof(tag)); | 1670 | epos->block.logicalBlockNum, sizeof(tag)); |
| 1831 | switch (UDF_I_ALLOCTYPE(inode)) { | 1671 | switch (UDF_I_ALLOCTYPE(inode)) { |
| 1832 | case ICBTAG_FLAG_AD_SHORT: | 1672 | case ICBTAG_FLAG_AD_SHORT: |
| 1833 | { | 1673 | sad = (short_ad *)sptr; |
| 1834 | sad = (short_ad *) sptr; | 1674 | sad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | |
| 1835 | sad->extLength = | 1675 | inode->i_sb->s_blocksize); |
| 1836 | cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | | 1676 | sad->extPosition = cpu_to_le32(epos->block.logicalBlockNum); |
| 1837 | inode->i_sb->s_blocksize); | 1677 | break; |
| 1838 | sad->extPosition = | ||
| 1839 | cpu_to_le32(epos->block.logicalBlockNum); | ||
| 1840 | break; | ||
| 1841 | } | ||
| 1842 | case ICBTAG_FLAG_AD_LONG: | 1678 | case ICBTAG_FLAG_AD_LONG: |
| 1843 | { | 1679 | lad = (long_ad *)sptr; |
| 1844 | lad = (long_ad *) sptr; | 1680 | lad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | |
| 1845 | lad->extLength = | 1681 | inode->i_sb->s_blocksize); |
| 1846 | cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | | 1682 | lad->extLocation = cpu_to_lelb(epos->block); |
| 1847 | inode->i_sb->s_blocksize); | 1683 | memset(lad->impUse, 0x00, sizeof(lad->impUse)); |
| 1848 | lad->extLocation = cpu_to_lelb(epos->block); | 1684 | break; |
| 1849 | memset(lad->impUse, 0x00, sizeof(lad->impUse)); | ||
| 1850 | break; | ||
| 1851 | } | ||
| 1852 | } | 1685 | } |
| 1853 | if (epos->bh) { | 1686 | if (epos->bh) { |
| 1854 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) | 1687 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 1855 | || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1688 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) |
| 1856 | udf_update_tag(epos->bh->b_data, loffset); | 1689 | udf_update_tag(epos->bh->b_data, loffset); |
| 1857 | else | 1690 | else |
| 1858 | udf_update_tag(epos->bh->b_data, | 1691 | udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc)); |
| 1859 | sizeof(struct allocExtDesc)); | ||
| 1860 | mark_buffer_dirty_inode(epos->bh, inode); | 1692 | mark_buffer_dirty_inode(epos->bh, inode); |
| 1861 | brelse(epos->bh); | 1693 | brelse(epos->bh); |
| 1862 | } else | 1694 | } else { |
| 1863 | mark_inode_dirty(inode); | 1695 | mark_inode_dirty(inode); |
| 1696 | } | ||
| 1864 | epos->bh = nbh; | 1697 | epos->bh = nbh; |
| 1865 | } | 1698 | } |
| 1866 | 1699 | ||
| @@ -1872,14 +1705,11 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1872 | } else { | 1705 | } else { |
| 1873 | aed = (struct allocExtDesc *)epos->bh->b_data; | 1706 | aed = (struct allocExtDesc *)epos->bh->b_data; |
| 1874 | aed->lengthAllocDescs = | 1707 | aed->lengthAllocDescs = |
| 1875 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); | 1708 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); |
| 1876 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) | 1709 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) |
| 1877 | || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1710 | udf_update_tag(epos->bh->b_data, epos->offset + (inc ? 0 : adsize)); |
| 1878 | udf_update_tag(epos->bh->b_data, | ||
| 1879 | epos->offset + (inc ? 0 : adsize)); | ||
| 1880 | else | 1711 | else |
| 1881 | udf_update_tag(epos->bh->b_data, | 1712 | udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc)); |
| 1882 | sizeof(struct allocExtDesc)); | ||
| 1883 | mark_buffer_dirty_inode(epos->bh, inode); | 1713 | mark_buffer_dirty_inode(epos->bh, inode); |
| 1884 | } | 1714 | } |
| 1885 | 1715 | ||
| @@ -1891,51 +1721,47 @@ int8_t udf_write_aext(struct inode * inode, struct extent_position * epos, | |||
| 1891 | { | 1721 | { |
| 1892 | int adsize; | 1722 | int adsize; |
| 1893 | uint8_t *ptr; | 1723 | uint8_t *ptr; |
| 1724 | short_ad *sad; | ||
| 1725 | long_ad *lad; | ||
| 1894 | 1726 | ||
| 1895 | if (!epos->bh) | 1727 | if (!epos->bh) |
| 1896 | ptr = | 1728 | ptr = UDF_I_DATA(inode) + epos->offset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode); |
| 1897 | UDF_I_DATA(inode) + epos->offset - | ||
| 1898 | udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode); | ||
| 1899 | else | 1729 | else |
| 1900 | ptr = epos->bh->b_data + epos->offset; | 1730 | ptr = epos->bh->b_data + epos->offset; |
| 1901 | 1731 | ||
| 1902 | switch (UDF_I_ALLOCTYPE(inode)) { | 1732 | switch (UDF_I_ALLOCTYPE(inode)) { |
| 1903 | case ICBTAG_FLAG_AD_SHORT: | 1733 | case ICBTAG_FLAG_AD_SHORT: |
| 1904 | { | 1734 | sad = (short_ad *)ptr; |
| 1905 | short_ad *sad = (short_ad *) ptr; | 1735 | sad->extLength = cpu_to_le32(elen); |
| 1906 | sad->extLength = cpu_to_le32(elen); | 1736 | sad->extPosition = cpu_to_le32(eloc.logicalBlockNum); |
| 1907 | sad->extPosition = cpu_to_le32(eloc.logicalBlockNum); | 1737 | adsize = sizeof(short_ad); |
| 1908 | adsize = sizeof(short_ad); | 1738 | break; |
| 1909 | break; | ||
| 1910 | } | ||
| 1911 | case ICBTAG_FLAG_AD_LONG: | 1739 | case ICBTAG_FLAG_AD_LONG: |
| 1912 | { | 1740 | lad = (long_ad *)ptr; |
| 1913 | long_ad *lad = (long_ad *) ptr; | 1741 | lad->extLength = cpu_to_le32(elen); |
| 1914 | lad->extLength = cpu_to_le32(elen); | 1742 | lad->extLocation = cpu_to_lelb(eloc); |
| 1915 | lad->extLocation = cpu_to_lelb(eloc); | 1743 | memset(lad->impUse, 0x00, sizeof(lad->impUse)); |
| 1916 | memset(lad->impUse, 0x00, sizeof(lad->impUse)); | 1744 | adsize = sizeof(long_ad); |
| 1917 | adsize = sizeof(long_ad); | 1745 | break; |
| 1918 | break; | ||
| 1919 | } | ||
| 1920 | default: | 1746 | default: |
| 1921 | return -1; | 1747 | return -1; |
| 1922 | } | 1748 | } |
| 1923 | 1749 | ||
| 1924 | if (epos->bh) { | 1750 | if (epos->bh) { |
| 1925 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) | 1751 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 1926 | || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) { | 1752 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) { |
| 1927 | struct allocExtDesc *aed = | 1753 | struct allocExtDesc *aed = (struct allocExtDesc *)epos->bh->b_data; |
| 1928 | (struct allocExtDesc *)epos->bh->b_data; | ||
| 1929 | udf_update_tag(epos->bh->b_data, | 1754 | udf_update_tag(epos->bh->b_data, |
| 1930 | le32_to_cpu(aed->lengthAllocDescs) + | 1755 | le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc)); |
| 1931 | sizeof(struct allocExtDesc)); | ||
| 1932 | } | 1756 | } |
| 1933 | mark_buffer_dirty_inode(epos->bh, inode); | 1757 | mark_buffer_dirty_inode(epos->bh, inode); |
| 1934 | } else | 1758 | } else { |
| 1935 | mark_inode_dirty(inode); | 1759 | mark_inode_dirty(inode); |
| 1760 | } | ||
| 1936 | 1761 | ||
| 1937 | if (inc) | 1762 | if (inc) |
| 1938 | epos->offset += adsize; | 1763 | epos->offset += adsize; |
| 1764 | |||
| 1939 | return (elen >> 30); | 1765 | return (elen >> 30); |
| 1940 | } | 1766 | } |
| 1941 | 1767 | ||
| @@ -1949,14 +1775,9 @@ int8_t udf_next_aext(struct inode * inode, struct extent_position * epos, | |||
| 1949 | epos->block = *eloc; | 1775 | epos->block = *eloc; |
| 1950 | epos->offset = sizeof(struct allocExtDesc); | 1776 | epos->offset = sizeof(struct allocExtDesc); |
| 1951 | brelse(epos->bh); | 1777 | brelse(epos->bh); |
| 1952 | if (! | 1778 | if (!(epos->bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, epos->block, 0)))) { |
| 1953 | (epos->bh = | ||
| 1954 | udf_tread(inode->i_sb, | ||
| 1955 | udf_get_lb_pblock(inode->i_sb, epos->block, | ||
| 1956 | 0)))) { | ||
| 1957 | udf_debug("reading block %d failed!\n", | 1779 | udf_debug("reading block %d failed!\n", |
| 1958 | udf_get_lb_pblock(inode->i_sb, epos->block, | 1780 | udf_get_lb_pblock(inode->i_sb, epos->block, 0)); |
| 1959 | 0)); | ||
| 1960 | return -1; | 1781 | return -1; |
| 1961 | } | 1782 | } |
| 1962 | } | 1783 | } |
| @@ -1970,75 +1791,49 @@ int8_t udf_current_aext(struct inode * inode, struct extent_position * epos, | |||
| 1970 | int alen; | 1791 | int alen; |
| 1971 | int8_t etype; | 1792 | int8_t etype; |
| 1972 | uint8_t *ptr; | 1793 | uint8_t *ptr; |
| 1794 | short_ad *sad; | ||
| 1795 | long_ad *lad; | ||
| 1796 | |||
| 1973 | 1797 | ||
| 1974 | if (!epos->bh) { | 1798 | if (!epos->bh) { |
| 1975 | if (!epos->offset) | 1799 | if (!epos->offset) |
| 1976 | epos->offset = udf_file_entry_alloc_offset(inode); | 1800 | epos->offset = udf_file_entry_alloc_offset(inode); |
| 1977 | ptr = | 1801 | ptr = UDF_I_DATA(inode) + epos->offset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode); |
| 1978 | UDF_I_DATA(inode) + epos->offset - | 1802 | alen = udf_file_entry_alloc_offset(inode) + UDF_I_LENALLOC(inode); |
| 1979 | udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode); | ||
| 1980 | alen = | ||
| 1981 | udf_file_entry_alloc_offset(inode) + UDF_I_LENALLOC(inode); | ||
| 1982 | } else { | 1803 | } else { |
| 1983 | if (!epos->offset) | 1804 | if (!epos->offset) |
| 1984 | epos->offset = sizeof(struct allocExtDesc); | 1805 | epos->offset = sizeof(struct allocExtDesc); |
| 1985 | ptr = epos->bh->b_data + epos->offset; | 1806 | ptr = epos->bh->b_data + epos->offset; |
| 1986 | alen = | 1807 | alen = sizeof(struct allocExtDesc) + |
| 1987 | sizeof(struct allocExtDesc) + | 1808 | le32_to_cpu(((struct allocExtDesc *)epos->bh->b_data)->lengthAllocDescs); |
| 1988 | le32_to_cpu(((struct allocExtDesc *)epos->bh->b_data)-> | ||
| 1989 | lengthAllocDescs); | ||
| 1990 | } | 1809 | } |
| 1991 | 1810 | ||
| 1992 | switch (UDF_I_ALLOCTYPE(inode)) { | 1811 | switch (UDF_I_ALLOCTYPE(inode)) { |
| 1993 | case ICBTAG_FLAG_AD_SHORT: | 1812 | case ICBTAG_FLAG_AD_SHORT: |
| 1994 | { | 1813 | if (!(sad = udf_get_fileshortad(ptr, alen, &epos->offset, inc))) |
| 1995 | short_ad *sad; | 1814 | return -1; |
| 1996 | 1815 | etype = le32_to_cpu(sad->extLength) >> 30; | |
| 1997 | if (! | 1816 | eloc->logicalBlockNum = le32_to_cpu(sad->extPosition); |
| 1998 | (sad = | 1817 | eloc->partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum; |
| 1999 | udf_get_fileshortad(ptr, alen, &epos->offset, | 1818 | *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK; |
| 2000 | inc))) | 1819 | break; |
| 2001 | return -1; | ||
| 2002 | |||
| 2003 | etype = le32_to_cpu(sad->extLength) >> 30; | ||
| 2004 | eloc->logicalBlockNum = le32_to_cpu(sad->extPosition); | ||
| 2005 | eloc->partitionReferenceNum = | ||
| 2006 | UDF_I_LOCATION(inode).partitionReferenceNum; | ||
| 2007 | *elen = | ||
| 2008 | le32_to_cpu(sad-> | ||
| 2009 | extLength) & UDF_EXTENT_LENGTH_MASK; | ||
| 2010 | break; | ||
| 2011 | } | ||
| 2012 | case ICBTAG_FLAG_AD_LONG: | 1820 | case ICBTAG_FLAG_AD_LONG: |
| 2013 | { | 1821 | if (!(lad = udf_get_filelongad(ptr, alen, &epos->offset, inc))) |
| 2014 | long_ad *lad; | ||
| 2015 | |||
| 2016 | if (! | ||
| 2017 | (lad = | ||
| 2018 | udf_get_filelongad(ptr, alen, &epos->offset, inc))) | ||
| 2019 | return -1; | ||
| 2020 | |||
| 2021 | etype = le32_to_cpu(lad->extLength) >> 30; | ||
| 2022 | *eloc = lelb_to_cpu(lad->extLocation); | ||
| 2023 | *elen = | ||
| 2024 | le32_to_cpu(lad-> | ||
| 2025 | extLength) & UDF_EXTENT_LENGTH_MASK; | ||
| 2026 | break; | ||
| 2027 | } | ||
| 2028 | default: | ||
| 2029 | { | ||
| 2030 | udf_debug("alloc_type = %d unsupported\n", | ||
| 2031 | UDF_I_ALLOCTYPE(inode)); | ||
| 2032 | return -1; | 1822 | return -1; |
| 2033 | } | 1823 | etype = le32_to_cpu(lad->extLength) >> 30; |
| 1824 | *eloc = lelb_to_cpu(lad->extLocation); | ||
| 1825 | *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK; | ||
| 1826 | break; | ||
| 1827 | default: | ||
| 1828 | udf_debug("alloc_type = %d unsupported\n", UDF_I_ALLOCTYPE(inode)); | ||
| 1829 | return -1; | ||
| 2034 | } | 1830 | } |
| 2035 | 1831 | ||
| 2036 | return etype; | 1832 | return etype; |
| 2037 | } | 1833 | } |
| 2038 | 1834 | ||
| 2039 | static int8_t | 1835 | static int8_t udf_insert_aext(struct inode *inode, struct extent_position epos, |
| 2040 | udf_insert_aext(struct inode *inode, struct extent_position epos, | 1836 | kernel_lb_addr neloc, uint32_t nelen) |
| 2041 | kernel_lb_addr neloc, uint32_t nelen) | ||
| 2042 | { | 1837 | { |
| 2043 | kernel_lb_addr oeloc; | 1838 | kernel_lb_addr oeloc; |
| 2044 | uint32_t oelen; | 1839 | uint32_t oelen; |
| @@ -2049,12 +1844,12 @@ udf_insert_aext(struct inode *inode, struct extent_position epos, | |||
| 2049 | 1844 | ||
| 2050 | while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1) { | 1845 | while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1) { |
| 2051 | udf_write_aext(inode, &epos, neloc, nelen, 1); | 1846 | udf_write_aext(inode, &epos, neloc, nelen, 1); |
| 2052 | |||
| 2053 | neloc = oeloc; | 1847 | neloc = oeloc; |
| 2054 | nelen = (etype << 30) | oelen; | 1848 | nelen = (etype << 30) | oelen; |
| 2055 | } | 1849 | } |
| 2056 | udf_add_aext(inode, &epos, neloc, nelen, 1); | 1850 | udf_add_aext(inode, &epos, neloc, nelen, 1); |
| 2057 | brelse(epos.bh); | 1851 | brelse(epos.bh); |
| 1852 | |||
| 2058 | return (nelen >> 30); | 1853 | return (nelen >> 30); |
| 2059 | } | 1854 | } |
| 2060 | 1855 | ||
| @@ -2105,15 +1900,12 @@ int8_t udf_delete_aext(struct inode * inode, struct extent_position epos, | |||
| 2105 | } else { | 1900 | } else { |
| 2106 | aed = (struct allocExtDesc *)oepos.bh->b_data; | 1901 | aed = (struct allocExtDesc *)oepos.bh->b_data; |
| 2107 | aed->lengthAllocDescs = | 1902 | aed->lengthAllocDescs = |
| 2108 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - | 1903 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2 * adsize)); |
| 2109 | (2 * adsize)); | 1904 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 2110 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) | 1905 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) |
| 2111 | || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1906 | udf_update_tag(oepos.bh->b_data, oepos.offset - (2 * adsize)); |
| 2112 | udf_update_tag(oepos.bh->b_data, | ||
| 2113 | oepos.offset - (2 * adsize)); | ||
| 2114 | else | 1907 | else |
| 2115 | udf_update_tag(oepos.bh->b_data, | 1908 | udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc)); |
| 2116 | sizeof(struct allocExtDesc)); | ||
| 2117 | mark_buffer_dirty_inode(oepos.bh, inode); | 1909 | mark_buffer_dirty_inode(oepos.bh, inode); |
| 2118 | } | 1910 | } |
| 2119 | } else { | 1911 | } else { |
| @@ -2124,21 +1916,19 @@ int8_t udf_delete_aext(struct inode * inode, struct extent_position epos, | |||
| 2124 | } else { | 1916 | } else { |
| 2125 | aed = (struct allocExtDesc *)oepos.bh->b_data; | 1917 | aed = (struct allocExtDesc *)oepos.bh->b_data; |
| 2126 | aed->lengthAllocDescs = | 1918 | aed->lengthAllocDescs = |
| 2127 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - | 1919 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize); |
| 2128 | adsize); | 1920 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 2129 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) | 1921 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) |
| 2130 | || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1922 | udf_update_tag(oepos.bh->b_data, epos.offset - adsize); |
| 2131 | udf_update_tag(oepos.bh->b_data, | ||
| 2132 | epos.offset - adsize); | ||
| 2133 | else | 1923 | else |
| 2134 | udf_update_tag(oepos.bh->b_data, | 1924 | udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc)); |
| 2135 | sizeof(struct allocExtDesc)); | ||
| 2136 | mark_buffer_dirty_inode(oepos.bh, inode); | 1925 | mark_buffer_dirty_inode(oepos.bh, inode); |
| 2137 | } | 1926 | } |
| 2138 | } | 1927 | } |
| 2139 | 1928 | ||
| 2140 | brelse(epos.bh); | 1929 | brelse(epos.bh); |
| 2141 | brelse(oepos.bh); | 1930 | brelse(oepos.bh); |
| 1931 | |||
| 2142 | return (elen >> 30); | 1932 | return (elen >> 30); |
| 2143 | } | 1933 | } |
| 2144 | 1934 | ||
| @@ -2162,8 +1952,7 @@ int8_t inode_bmap(struct inode * inode, sector_t block, | |||
| 2162 | 1952 | ||
| 2163 | do { | 1953 | do { |
| 2164 | if ((etype = udf_next_aext(inode, pos, eloc, elen, 1)) == -1) { | 1954 | if ((etype = udf_next_aext(inode, pos, eloc, elen, 1)) == -1) { |
| 2165 | *offset = | 1955 | *offset = (bcount - lbcount) >> inode->i_sb->s_blocksize_bits; |
| 2166 | (bcount - lbcount) >> inode->i_sb->s_blocksize_bits; | ||
| 2167 | UDF_I_LENEXTENTS(inode) = lbcount; | 1956 | UDF_I_LENEXTENTS(inode) = lbcount; |
| 2168 | return -1; | 1957 | return -1; |
| 2169 | } | 1958 | } |
| @@ -2180,13 +1969,12 @@ long udf_block_map(struct inode *inode, sector_t block) | |||
| 2180 | kernel_lb_addr eloc; | 1969 | kernel_lb_addr eloc; |
| 2181 | uint32_t elen; | 1970 | uint32_t elen; |
| 2182 | sector_t offset; | 1971 | sector_t offset; |
| 2183 | struct extent_position epos = { NULL, 0, {0, 0} }; | 1972 | struct extent_position epos = {}; |
| 2184 | int ret; | 1973 | int ret; |
| 2185 | 1974 | ||
| 2186 | lock_kernel(); | 1975 | lock_kernel(); |
| 2187 | 1976 | ||
| 2188 | if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) == | 1977 | if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) |
| 2189 | (EXT_RECORDED_ALLOCATED >> 30)) | ||
| 2190 | ret = udf_get_lb_pblock(inode->i_sb, eloc, offset); | 1978 | ret = udf_get_lb_pblock(inode->i_sb, eloc, offset); |
| 2191 | else | 1979 | else |
| 2192 | ret = 0; | 1980 | ret = 0; |
diff --git a/fs/udf/lowlevel.c b/fs/udf/lowlevel.c index 4826c3616eef..579bae71e67e 100644 --- a/fs/udf/lowlevel.c +++ b/fs/udf/lowlevel.c | |||
| @@ -43,7 +43,7 @@ unsigned int udf_get_last_session(struct super_block *sb) | |||
| 43 | udf_debug("XA disk: %s, vol_desc_start=%d\n", | 43 | udf_debug("XA disk: %s, vol_desc_start=%d\n", |
| 44 | (ms_info.xa_flag ? "yes" : "no"), ms_info.addr.lba); | 44 | (ms_info.xa_flag ? "yes" : "no"), ms_info.addr.lba); |
| 45 | #if WE_OBEY_THE_WRITTEN_STANDARDS | 45 | #if WE_OBEY_THE_WRITTEN_STANDARDS |
| 46 | if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */ | 46 | if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */ |
| 47 | #endif | 47 | #endif |
| 48 | vol_desc_start = ms_info.addr.lba; | 48 | vol_desc_start = ms_info.addr.lba; |
| 49 | } else { | 49 | } else { |
| @@ -57,7 +57,7 @@ unsigned long udf_get_last_block(struct super_block *sb) | |||
| 57 | struct block_device *bdev = sb->s_bdev; | 57 | struct block_device *bdev = sb->s_bdev; |
| 58 | unsigned long lblock = 0; | 58 | unsigned long lblock = 0; |
| 59 | 59 | ||
| 60 | if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long)&lblock)) | 60 | if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock)) |
| 61 | lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits; | 61 | lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits; |
| 62 | 62 | ||
| 63 | if (lblock) | 63 | if (lblock) |
diff --git a/fs/udf/misc.c b/fs/udf/misc.c index a7f57277a96e..15297deb5051 100644 --- a/fs/udf/misc.c +++ b/fs/udf/misc.c | |||
| @@ -54,15 +54,15 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size, | |||
| 54 | int i; | 54 | int i; |
| 55 | 55 | ||
| 56 | ea = UDF_I_DATA(inode); | 56 | ea = UDF_I_DATA(inode); |
| 57 | if (UDF_I_LENEATTR(inode)) | 57 | if (UDF_I_LENEATTR(inode)) { |
| 58 | ad = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode); | 58 | ad = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode); |
| 59 | else { | 59 | } else { |
| 60 | ad = ea; | 60 | ad = ea; |
| 61 | size += sizeof(struct extendedAttrHeaderDesc); | 61 | size += sizeof(struct extendedAttrHeaderDesc); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | offset = inode->i_sb->s_blocksize - udf_file_entry_alloc_offset(inode) - | 64 | offset = inode->i_sb->s_blocksize - udf_file_entry_alloc_offset(inode) - |
| 65 | UDF_I_LENALLOC(inode); | 65 | UDF_I_LENALLOC(inode); |
| 66 | 66 | ||
| 67 | /* TODO - Check for FreeEASpace */ | 67 | /* TODO - Check for FreeEASpace */ |
| 68 | 68 | ||
| @@ -76,56 +76,45 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size, | |||
| 76 | 76 | ||
| 77 | if (UDF_I_LENEATTR(inode)) { | 77 | if (UDF_I_LENEATTR(inode)) { |
| 78 | /* check checksum/crc */ | 78 | /* check checksum/crc */ |
| 79 | if (le16_to_cpu(eahd->descTag.tagIdent) != | 79 | if (le16_to_cpu(eahd->descTag.tagIdent) != TAG_IDENT_EAHD || |
| 80 | TAG_IDENT_EAHD | 80 | le32_to_cpu(eahd->descTag.tagLocation) != UDF_I_LOCATION(inode).logicalBlockNum) { |
| 81 | || le32_to_cpu(eahd->descTag.tagLocation) != | ||
| 82 | UDF_I_LOCATION(inode).logicalBlockNum) { | ||
| 83 | return NULL; | 81 | return NULL; |
| 84 | } | 82 | } |
| 85 | } else { | 83 | } else { |
| 86 | size -= sizeof(struct extendedAttrHeaderDesc); | 84 | size -= sizeof(struct extendedAttrHeaderDesc); |
| 87 | UDF_I_LENEATTR(inode) += | 85 | UDF_I_LENEATTR(inode) += sizeof(struct extendedAttrHeaderDesc); |
| 88 | sizeof(struct extendedAttrHeaderDesc); | ||
| 89 | eahd->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EAHD); | 86 | eahd->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EAHD); |
| 90 | if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200) | 87 | if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200) |
| 91 | eahd->descTag.descVersion = cpu_to_le16(3); | 88 | eahd->descTag.descVersion = cpu_to_le16(3); |
| 92 | else | 89 | else |
| 93 | eahd->descTag.descVersion = cpu_to_le16(2); | 90 | eahd->descTag.descVersion = cpu_to_le16(2); |
| 94 | eahd->descTag.tagSerialNum = | 91 | eahd->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb)); |
| 95 | cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb)); | 92 | eahd->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); |
| 96 | eahd->descTag.tagLocation = | ||
| 97 | cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); | ||
| 98 | eahd->impAttrLocation = cpu_to_le32(0xFFFFFFFF); | 93 | eahd->impAttrLocation = cpu_to_le32(0xFFFFFFFF); |
| 99 | eahd->appAttrLocation = cpu_to_le32(0xFFFFFFFF); | 94 | eahd->appAttrLocation = cpu_to_le32(0xFFFFFFFF); |
| 100 | } | 95 | } |
| 101 | 96 | ||
| 102 | offset = UDF_I_LENEATTR(inode); | 97 | offset = UDF_I_LENEATTR(inode); |
| 103 | if (type < 2048) { | 98 | if (type < 2048) { |
| 104 | if (le32_to_cpu(eahd->appAttrLocation) < | 99 | if (le32_to_cpu(eahd->appAttrLocation) < UDF_I_LENEATTR(inode)) { |
| 105 | UDF_I_LENEATTR(inode)) { | 100 | uint32_t aal = le32_to_cpu(eahd->appAttrLocation); |
| 106 | uint32_t aal = | 101 | memmove(&ea[offset - aal + size], |
| 107 | le32_to_cpu(eahd->appAttrLocation); | 102 | &ea[aal], offset - aal); |
| 108 | memmove(&ea[offset - aal + size], &ea[aal], | ||
| 109 | offset - aal); | ||
| 110 | offset -= aal; | 103 | offset -= aal; |
| 111 | eahd->appAttrLocation = cpu_to_le32(aal + size); | 104 | eahd->appAttrLocation = cpu_to_le32(aal + size); |
| 112 | } | 105 | } |
| 113 | if (le32_to_cpu(eahd->impAttrLocation) < | 106 | if (le32_to_cpu(eahd->impAttrLocation) < UDF_I_LENEATTR(inode)) { |
| 114 | UDF_I_LENEATTR(inode)) { | 107 | uint32_t ial = le32_to_cpu(eahd->impAttrLocation); |
| 115 | uint32_t ial = | 108 | memmove(&ea[offset - ial + size], |
| 116 | le32_to_cpu(eahd->impAttrLocation); | 109 | &ea[ial], offset - ial); |
| 117 | memmove(&ea[offset - ial + size], &ea[ial], | ||
| 118 | offset - ial); | ||
| 119 | offset -= ial; | 110 | offset -= ial; |
| 120 | eahd->impAttrLocation = cpu_to_le32(ial + size); | 111 | eahd->impAttrLocation = cpu_to_le32(ial + size); |
| 121 | } | 112 | } |
| 122 | } else if (type < 65536) { | 113 | } else if (type < 65536) { |
| 123 | if (le32_to_cpu(eahd->appAttrLocation) < | 114 | if (le32_to_cpu(eahd->appAttrLocation) < UDF_I_LENEATTR(inode)) { |
| 124 | UDF_I_LENEATTR(inode)) { | 115 | uint32_t aal = le32_to_cpu(eahd->appAttrLocation); |
| 125 | uint32_t aal = | 116 | memmove(&ea[offset - aal + size], |
| 126 | le32_to_cpu(eahd->appAttrLocation); | 117 | &ea[aal], offset - aal); |
| 127 | memmove(&ea[offset - aal + size], &ea[aal], | ||
| 128 | offset - aal); | ||
| 129 | offset -= aal; | 118 | offset -= aal; |
| 130 | eahd->appAttrLocation = cpu_to_le32(aal + size); | 119 | eahd->appAttrLocation = cpu_to_le32(aal + size); |
| 131 | } | 120 | } |
| @@ -133,18 +122,18 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size, | |||
| 133 | /* rewrite CRC + checksum of eahd */ | 122 | /* rewrite CRC + checksum of eahd */ |
| 134 | crclen = sizeof(struct extendedAttrHeaderDesc) - sizeof(tag); | 123 | crclen = sizeof(struct extendedAttrHeaderDesc) - sizeof(tag); |
| 135 | eahd->descTag.descCRCLength = cpu_to_le16(crclen); | 124 | eahd->descTag.descCRCLength = cpu_to_le16(crclen); |
| 136 | eahd->descTag.descCRC = | 125 | eahd->descTag.descCRC = cpu_to_le16(udf_crc((char *)eahd + |
| 137 | cpu_to_le16(udf_crc((char *)eahd + sizeof(tag), crclen, 0)); | 126 | sizeof(tag), crclen, 0)); |
| 138 | eahd->descTag.tagChecksum = 0; | 127 | eahd->descTag.tagChecksum = 0; |
| 139 | for (i = 0; i < 16; i++) | 128 | for (i = 0; i < 16; i++) |
| 140 | if (i != 4) | 129 | if (i != 4) |
| 141 | eahd->descTag.tagChecksum += | 130 | eahd->descTag.tagChecksum += ((uint8_t *)&(eahd->descTag))[i]; |
| 142 | ((uint8_t *) & (eahd->descTag))[i]; | ||
| 143 | UDF_I_LENEATTR(inode) += size; | 131 | UDF_I_LENEATTR(inode) += size; |
| 144 | return (struct genericFormat *)&ea[offset]; | 132 | return (struct genericFormat *)&ea[offset]; |
| 145 | } | 133 | } |
| 146 | if (loc & 0x02) { | 134 | if (loc & 0x02) { |
| 147 | } | 135 | } |
| 136 | |||
| 148 | return NULL; | 137 | return NULL; |
| 149 | } | 138 | } |
| 150 | 139 | ||
| @@ -163,8 +152,7 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type, | |||
| 163 | 152 | ||
| 164 | /* check checksum/crc */ | 153 | /* check checksum/crc */ |
| 165 | if (le16_to_cpu(eahd->descTag.tagIdent) != TAG_IDENT_EAHD || | 154 | if (le16_to_cpu(eahd->descTag.tagIdent) != TAG_IDENT_EAHD || |
| 166 | le32_to_cpu(eahd->descTag.tagLocation) != | 155 | le32_to_cpu(eahd->descTag.tagLocation) != UDF_I_LOCATION(inode).logicalBlockNum) { |
| 167 | UDF_I_LOCATION(inode).logicalBlockNum) { | ||
| 168 | return NULL; | 156 | return NULL; |
| 169 | } | 157 | } |
| 170 | 158 | ||
| @@ -177,13 +165,13 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type, | |||
| 177 | 165 | ||
| 178 | while (offset < UDF_I_LENEATTR(inode)) { | 166 | while (offset < UDF_I_LENEATTR(inode)) { |
| 179 | gaf = (struct genericFormat *)&ea[offset]; | 167 | gaf = (struct genericFormat *)&ea[offset]; |
| 180 | if (le32_to_cpu(gaf->attrType) == type | 168 | if (le32_to_cpu(gaf->attrType) == type && gaf->attrSubtype == subtype) |
| 181 | && gaf->attrSubtype == subtype) | ||
| 182 | return gaf; | 169 | return gaf; |
| 183 | else | 170 | else |
| 184 | offset += le32_to_cpu(gaf->attrLength); | 171 | offset += le32_to_cpu(gaf->attrLength); |
| 185 | } | 172 | } |
| 186 | } | 173 | } |
| 174 | |||
| 187 | return NULL; | 175 | return NULL; |
| 188 | } | 176 | } |
| 189 | 177 | ||
| @@ -216,23 +204,22 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | |||
| 216 | return NULL; | 204 | return NULL; |
| 217 | } | 205 | } |
| 218 | 206 | ||
| 219 | tag_p = (tag *) (bh->b_data); | 207 | tag_p = (tag *)(bh->b_data); |
| 220 | 208 | ||
| 221 | *ident = le16_to_cpu(tag_p->tagIdent); | 209 | *ident = le16_to_cpu(tag_p->tagIdent); |
| 222 | 210 | ||
| 223 | if (location != le32_to_cpu(tag_p->tagLocation)) { | 211 | if (location != le32_to_cpu(tag_p->tagLocation)) { |
| 224 | udf_debug("location mismatch block %u, tag %u != %u\n", | 212 | udf_debug("location mismatch block %u, tag %u != %u\n", |
| 225 | block + UDF_SB_SESSION(sb), | 213 | block + UDF_SB_SESSION(sb), le32_to_cpu(tag_p->tagLocation), location); |
| 226 | le32_to_cpu(tag_p->tagLocation), location); | ||
| 227 | goto error_out; | 214 | goto error_out; |
| 228 | } | 215 | } |
| 229 | 216 | ||
| 230 | /* Verify the tag checksum */ | 217 | /* Verify the tag checksum */ |
| 231 | checksum = 0U; | 218 | checksum = 0U; |
| 232 | for (i = 0; i < 4; i++) | 219 | for (i = 0; i < 4; i++) |
| 233 | checksum += (uint8_t) (bh->b_data[i]); | 220 | checksum += (uint8_t)(bh->b_data[i]); |
| 234 | for (i = 5; i < 16; i++) | 221 | for (i = 5; i < 16; i++) |
| 235 | checksum += (uint8_t) (bh->b_data[i]); | 222 | checksum += (uint8_t)(bh->b_data[i]); |
| 236 | if (checksum != tag_p->tagChecksum) { | 223 | if (checksum != tag_p->tagChecksum) { |
| 237 | printk(KERN_ERR "udf: tag checksum failed block %d\n", block); | 224 | printk(KERN_ERR "udf: tag checksum failed block %d\n", block); |
| 238 | goto error_out; | 225 | goto error_out; |
| @@ -249,16 +236,14 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | |||
| 249 | /* Verify the descriptor CRC */ | 236 | /* Verify the descriptor CRC */ |
| 250 | if (le16_to_cpu(tag_p->descCRCLength) + sizeof(tag) > sb->s_blocksize || | 237 | if (le16_to_cpu(tag_p->descCRCLength) + sizeof(tag) > sb->s_blocksize || |
| 251 | le16_to_cpu(tag_p->descCRC) == udf_crc(bh->b_data + sizeof(tag), | 238 | le16_to_cpu(tag_p->descCRC) == udf_crc(bh->b_data + sizeof(tag), |
| 252 | le16_to_cpu(tag_p-> | 239 | le16_to_cpu(tag_p->descCRCLength), 0)) { |
| 253 | descCRCLength), | ||
| 254 | 0)) { | ||
| 255 | return bh; | 240 | return bh; |
| 256 | } | 241 | } |
| 257 | udf_debug("Crc failure block %d: crc = %d, crclen = %d\n", | 242 | udf_debug("Crc failure block %d: crc = %d, crclen = %d\n", |
| 258 | block + UDF_SB_SESSION(sb), le16_to_cpu(tag_p->descCRC), | 243 | block + UDF_SB_SESSION(sb), le16_to_cpu(tag_p->descCRC), |
| 259 | le16_to_cpu(tag_p->descCRCLength)); | 244 | le16_to_cpu(tag_p->descCRCLength)); |
| 260 | 245 | ||
| 261 | error_out: | 246 | error_out: |
| 262 | brelse(bh); | 247 | brelse(bh); |
| 263 | return NULL; | 248 | return NULL; |
| 264 | } | 249 | } |
| @@ -272,7 +257,7 @@ struct buffer_head *udf_read_ptagged(struct super_block *sb, kernel_lb_addr loc, | |||
| 272 | 257 | ||
| 273 | void udf_update_tag(char *data, int length) | 258 | void udf_update_tag(char *data, int length) |
| 274 | { | 259 | { |
| 275 | tag *tptr = (tag *) data; | 260 | tag *tptr = (tag *)data; |
| 276 | int i; | 261 | int i; |
| 277 | 262 | ||
| 278 | length -= sizeof(tag); | 263 | length -= sizeof(tag); |
| @@ -283,13 +268,13 @@ void udf_update_tag(char *data, int length) | |||
| 283 | 268 | ||
| 284 | for (i = 0; i < 16; i++) | 269 | for (i = 0; i < 16; i++) |
| 285 | if (i != 4) | 270 | if (i != 4) |
| 286 | tptr->tagChecksum += (uint8_t) (data[i]); | 271 | tptr->tagChecksum += (uint8_t)(data[i]); |
| 287 | } | 272 | } |
| 288 | 273 | ||
| 289 | void udf_new_tag(char *data, uint16_t ident, uint16_t version, uint16_t snum, | 274 | void udf_new_tag(char *data, uint16_t ident, uint16_t version, uint16_t snum, |
| 290 | uint32_t loc, int length) | 275 | uint32_t loc, int length) |
| 291 | { | 276 | { |
| 292 | tag *tptr = (tag *) data; | 277 | tag *tptr = (tag *)data; |
| 293 | tptr->tagIdent = cpu_to_le16(ident); | 278 | tptr->tagIdent = cpu_to_le16(ident); |
| 294 | tptr->descVersion = cpu_to_le16(version); | 279 | tptr->descVersion = cpu_to_le16(version); |
| 295 | tptr->tagSerialNum = cpu_to_le16(snum); | 280 | tptr->tagSerialNum = cpu_to_le16(snum); |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 334d363a0903..bec96a6b3343 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
| @@ -37,6 +37,7 @@ static inline int udf_match(int len1, const char *name1, int len2, | |||
| 37 | { | 37 | { |
| 38 | if (len1 != len2) | 38 | if (len1 != len2) |
| 39 | return 0; | 39 | return 0; |
| 40 | |||
| 40 | return !memcmp(name1, name2, len1); | 41 | return !memcmp(name1, name2, len1); |
| 41 | } | 42 | } |
| 42 | 43 | ||
| @@ -52,7 +53,7 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi, | |||
| 52 | uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse); | 53 | uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse); |
| 53 | uint8_t lfi = cfi->lengthFileIdent; | 54 | uint8_t lfi = cfi->lengthFileIdent; |
| 54 | int padlen = fibh->eoffset - fibh->soffset - liu - lfi - | 55 | int padlen = fibh->eoffset - fibh->soffset - liu - lfi - |
| 55 | sizeof(struct fileIdentDesc); | 56 | sizeof(struct fileIdentDesc); |
| 56 | int adinicb = 0; | 57 | int adinicb = 0; |
| 57 | 58 | ||
| 58 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) | 59 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) |
| @@ -61,85 +62,75 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi, | |||
| 61 | offset = fibh->soffset + sizeof(struct fileIdentDesc); | 62 | offset = fibh->soffset + sizeof(struct fileIdentDesc); |
| 62 | 63 | ||
| 63 | if (impuse) { | 64 | if (impuse) { |
| 64 | if (adinicb || (offset + liu < 0)) | 65 | if (adinicb || (offset + liu < 0)) { |
| 65 | memcpy((uint8_t *) sfi->impUse, impuse, liu); | 66 | memcpy((uint8_t *)sfi->impUse, impuse, liu); |
| 66 | else if (offset >= 0) | 67 | } else if (offset >= 0) { |
| 67 | memcpy(fibh->ebh->b_data + offset, impuse, liu); | 68 | memcpy(fibh->ebh->b_data + offset, impuse, liu); |
| 68 | else { | 69 | } else { |
| 69 | memcpy((uint8_t *) sfi->impUse, impuse, -offset); | 70 | memcpy((uint8_t *)sfi->impUse, impuse, -offset); |
| 70 | memcpy(fibh->ebh->b_data, impuse - offset, | 71 | memcpy(fibh->ebh->b_data, impuse - offset, liu + offset); |
| 71 | liu + offset); | ||
| 72 | } | 72 | } |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | offset += liu; | 75 | offset += liu; |
| 76 | 76 | ||
| 77 | if (fileident) { | 77 | if (fileident) { |
| 78 | if (adinicb || (offset + lfi < 0)) | 78 | if (adinicb || (offset + lfi < 0)) { |
| 79 | memcpy((uint8_t *) sfi->fileIdent + liu, fileident, | 79 | memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi); |
| 80 | lfi); | 80 | } else if (offset >= 0) { |
| 81 | else if (offset >= 0) | ||
| 82 | memcpy(fibh->ebh->b_data + offset, fileident, lfi); | 81 | memcpy(fibh->ebh->b_data + offset, fileident, lfi); |
| 83 | else { | 82 | } else { |
| 84 | memcpy((uint8_t *) sfi->fileIdent + liu, fileident, | 83 | memcpy((uint8_t *)sfi->fileIdent + liu, fileident, -offset); |
| 85 | -offset); | 84 | memcpy(fibh->ebh->b_data, fileident - offset, lfi + offset); |
| 86 | memcpy(fibh->ebh->b_data, fileident - offset, | ||
| 87 | lfi + offset); | ||
| 88 | } | 85 | } |
| 89 | } | 86 | } |
| 90 | 87 | ||
| 91 | offset += lfi; | 88 | offset += lfi; |
| 92 | 89 | ||
| 93 | if (adinicb || (offset + padlen < 0)) | 90 | if (adinicb || (offset + padlen < 0)) { |
| 94 | memset((uint8_t *) sfi->padding + liu + lfi, 0x00, padlen); | 91 | memset((uint8_t *)sfi->padding + liu + lfi, 0x00, padlen); |
| 95 | else if (offset >= 0) | 92 | } else if (offset >= 0) { |
| 96 | memset(fibh->ebh->b_data + offset, 0x00, padlen); | 93 | memset(fibh->ebh->b_data + offset, 0x00, padlen); |
| 97 | else { | 94 | } else { |
| 98 | memset((uint8_t *) sfi->padding + liu + lfi, 0x00, -offset); | 95 | memset((uint8_t *)sfi->padding + liu + lfi, 0x00, -offset); |
| 99 | memset(fibh->ebh->b_data, 0x00, padlen + offset); | 96 | memset(fibh->ebh->b_data, 0x00, padlen + offset); |
| 100 | } | 97 | } |
| 101 | 98 | ||
| 102 | crc = | 99 | crc = udf_crc((uint8_t *)cfi + sizeof(tag), |
| 103 | udf_crc((uint8_t *) cfi + sizeof(tag), | 100 | sizeof(struct fileIdentDesc) - sizeof(tag), 0); |
| 104 | sizeof(struct fileIdentDesc) - sizeof(tag), 0); | 101 | |
| 105 | 102 | if (fibh->sbh == fibh->ebh) { | |
| 106 | if (fibh->sbh == fibh->ebh) | 103 | crc = udf_crc((uint8_t *)sfi->impUse, |
| 107 | crc = udf_crc((uint8_t *) sfi->impUse, | 104 | crclen + sizeof(tag) - sizeof(struct fileIdentDesc), crc); |
| 108 | crclen + sizeof(tag) - | 105 | } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) { |
| 109 | sizeof(struct fileIdentDesc), crc); | 106 | crc = udf_crc(fibh->ebh->b_data + sizeof(struct fileIdentDesc) + fibh->soffset, |
| 110 | else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) | 107 | crclen + sizeof(tag) - sizeof(struct fileIdentDesc), crc); |
| 111 | crc = | 108 | } else { |
| 112 | udf_crc(fibh->ebh->b_data + sizeof(struct fileIdentDesc) + | 109 | crc = udf_crc((uint8_t *)sfi->impUse, |
| 113 | fibh->soffset, | 110 | -fibh->soffset - sizeof(struct fileIdentDesc), crc); |
| 114 | crclen + sizeof(tag) - sizeof(struct fileIdentDesc), | ||
| 115 | crc); | ||
| 116 | else { | ||
| 117 | crc = udf_crc((uint8_t *) sfi->impUse, | ||
| 118 | -fibh->soffset - sizeof(struct fileIdentDesc), | ||
| 119 | crc); | ||
| 120 | crc = udf_crc(fibh->ebh->b_data, fibh->eoffset, crc); | 111 | crc = udf_crc(fibh->ebh->b_data, fibh->eoffset, crc); |
| 121 | } | 112 | } |
| 122 | 113 | ||
| 123 | cfi->descTag.descCRC = cpu_to_le16(crc); | 114 | cfi->descTag.descCRC = cpu_to_le16(crc); |
| 124 | cfi->descTag.descCRCLength = cpu_to_le16(crclen); | 115 | cfi->descTag.descCRCLength = cpu_to_le16(crclen); |
| 125 | 116 | ||
| 126 | for (i = 0; i < 16; i++) | 117 | for (i = 0; i < 16; i++) { |
| 127 | if (i != 4) | 118 | if (i != 4) |
| 128 | checksum += ((uint8_t *) & cfi->descTag)[i]; | 119 | checksum += ((uint8_t *)&cfi->descTag)[i]; |
| 120 | } | ||
| 129 | 121 | ||
| 130 | cfi->descTag.tagChecksum = checksum; | 122 | cfi->descTag.tagChecksum = checksum; |
| 131 | if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) | 123 | if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) { |
| 132 | memcpy((uint8_t *) sfi, (uint8_t *) cfi, | 124 | memcpy((uint8_t *)sfi, (uint8_t *)cfi, sizeof(struct fileIdentDesc)); |
| 133 | sizeof(struct fileIdentDesc)); | 125 | } else { |
| 134 | else { | 126 | memcpy((uint8_t *)sfi, (uint8_t *)cfi, -fibh->soffset); |
| 135 | memcpy((uint8_t *) sfi, (uint8_t *) cfi, -fibh->soffset); | 127 | memcpy(fibh->ebh->b_data, (uint8_t *)cfi - fibh->soffset, |
| 136 | memcpy(fibh->ebh->b_data, (uint8_t *) cfi - fibh->soffset, | ||
| 137 | sizeof(struct fileIdentDesc) + fibh->soffset); | 128 | sizeof(struct fileIdentDesc) + fibh->soffset); |
| 138 | } | 129 | } |
| 139 | 130 | ||
| 140 | if (adinicb) | 131 | if (adinicb) { |
| 141 | mark_inode_dirty(inode); | 132 | mark_inode_dirty(inode); |
| 142 | else { | 133 | } else { |
| 143 | if (fibh->sbh != fibh->ebh) | 134 | if (fibh->sbh != fibh->ebh) |
| 144 | mark_buffer_dirty_inode(fibh->ebh, inode); | 135 | mark_buffer_dirty_inode(fibh->ebh, inode); |
| 145 | mark_buffer_dirty_inode(fibh->sbh, inode); | 136 | mark_buffer_dirty_inode(fibh->sbh, inode); |
| @@ -163,26 +154,25 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir, | |||
| 163 | kernel_lb_addr eloc; | 154 | kernel_lb_addr eloc; |
| 164 | uint32_t elen; | 155 | uint32_t elen; |
| 165 | sector_t offset; | 156 | sector_t offset; |
| 166 | struct extent_position epos = { NULL, 0, {0, 0} }; | 157 | struct extent_position epos = {}; |
| 167 | 158 | ||
| 168 | size = (udf_ext0_offset(dir) + dir->i_size) >> 2; | 159 | size = (udf_ext0_offset(dir) + dir->i_size) >> 2; |
| 169 | f_pos = (udf_ext0_offset(dir) >> 2); | 160 | f_pos = (udf_ext0_offset(dir) >> 2); |
| 170 | 161 | ||
| 171 | fibh->soffset = fibh->eoffset = | 162 | fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; |
| 172 | (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; | 163 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 173 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) | ||
| 174 | fibh->sbh = fibh->ebh = NULL; | 164 | fibh->sbh = fibh->ebh = NULL; |
| 175 | else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), | 165 | } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), |
| 176 | &epos, &eloc, &elen, | 166 | &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { |
| 177 | &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { | ||
| 178 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 167 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); |
| 179 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 168 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
| 180 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) | 169 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) |
| 181 | epos.offset -= sizeof(short_ad); | 170 | epos.offset -= sizeof(short_ad); |
| 182 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) | 171 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) |
| 183 | epos.offset -= sizeof(long_ad); | 172 | epos.offset -= sizeof(long_ad); |
| 184 | } else | 173 | } else { |
| 185 | offset = 0; | 174 | offset = 0; |
| 175 | } | ||
| 186 | 176 | ||
| 187 | if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) { | 177 | if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) { |
| 188 | brelse(epos.bh); | 178 | brelse(epos.bh); |
| @@ -196,7 +186,6 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir, | |||
| 196 | while ((f_pos < size)) { | 186 | while ((f_pos < size)) { |
| 197 | fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, | 187 | fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, |
| 198 | &elen, &offset); | 188 | &elen, &offset); |
| 199 | |||
| 200 | if (!fi) { | 189 | if (!fi) { |
| 201 | if (fibh->sbh != fibh->ebh) | 190 | if (fibh->sbh != fibh->ebh) |
| 202 | brelse(fibh->ebh); | 191 | brelse(fibh->ebh); |
| @@ -213,20 +202,14 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir, | |||
| 213 | } else { | 202 | } else { |
| 214 | int poffset; /* Unpaded ending offset */ | 203 | int poffset; /* Unpaded ending offset */ |
| 215 | 204 | ||
| 216 | poffset = | 205 | poffset = fibh->soffset + sizeof(struct fileIdentDesc) + liu + lfi; |
| 217 | fibh->soffset + sizeof(struct fileIdentDesc) + liu + | ||
| 218 | lfi; | ||
| 219 | 206 | ||
| 220 | if (poffset >= lfi) | 207 | if (poffset >= lfi) { |
| 221 | nameptr = | 208 | nameptr = (uint8_t *)(fibh->ebh->b_data + poffset - lfi); |
| 222 | (uint8_t *) (fibh->ebh->b_data + poffset - | 209 | } else { |
| 223 | lfi); | ||
| 224 | else { | ||
| 225 | nameptr = fname; | 210 | nameptr = fname; |
| 226 | memcpy(nameptr, fi->fileIdent + liu, | 211 | memcpy(nameptr, fi->fileIdent + liu, lfi - poffset); |
| 227 | lfi - poffset); | 212 | memcpy(nameptr + lfi - poffset, fibh->ebh->b_data, poffset); |
| 228 | memcpy(nameptr + lfi - poffset, | ||
| 229 | fibh->ebh->b_data, poffset); | ||
| 230 | } | 213 | } |
| 231 | } | 214 | } |
| 232 | 215 | ||
| @@ -244,18 +227,18 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir, | |||
| 244 | continue; | 227 | continue; |
| 245 | 228 | ||
| 246 | if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi))) { | 229 | if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi))) { |
| 247 | if (udf_match | 230 | if (udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name)) { |
| 248 | (flen, fname, dentry->d_name.len, | ||
| 249 | dentry->d_name.name)) { | ||
| 250 | brelse(epos.bh); | 231 | brelse(epos.bh); |
| 251 | return fi; | 232 | return fi; |
| 252 | } | 233 | } |
| 253 | } | 234 | } |
| 254 | } | 235 | } |
| 236 | |||
| 255 | if (fibh->sbh != fibh->ebh) | 237 | if (fibh->sbh != fibh->ebh) |
| 256 | brelse(fibh->ebh); | 238 | brelse(fibh->ebh); |
| 257 | brelse(fibh->sbh); | 239 | brelse(fibh->sbh); |
| 258 | brelse(epos.bh); | 240 | brelse(epos.bh); |
| 241 | |||
| 259 | return NULL; | 242 | return NULL; |
| 260 | } | 243 | } |
| 261 | 244 | ||
| @@ -306,15 +289,19 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | |||
| 306 | #ifdef UDF_RECOVERY | 289 | #ifdef UDF_RECOVERY |
| 307 | /* temporary shorthand for specifying files by inode number */ | 290 | /* temporary shorthand for specifying files by inode number */ |
| 308 | if (!strncmp(dentry->d_name.name, ".B=", 3)) { | 291 | if (!strncmp(dentry->d_name.name, ".B=", 3)) { |
| 309 | kernel_lb_addr lb = | 292 | kernel_lb_addr lb = { |
| 310 | { 0, simple_strtoul(dentry->d_name.name + 3, NULL, 0) }; | 293 | .logicalBlockNum = 0, |
| 294 | .partitionReferenceNum = simple_strtoul(dentry->d_name.name + 3, | ||
| 295 | NULL, 0), | ||
| 296 | }; | ||
| 311 | inode = udf_iget(dir->i_sb, lb); | 297 | inode = udf_iget(dir->i_sb, lb); |
| 312 | if (!inode) { | 298 | if (!inode) { |
| 313 | unlock_kernel(); | 299 | unlock_kernel(); |
| 314 | return ERR_PTR(-EACCES); | 300 | return ERR_PTR(-EACCES); |
| 315 | } | 301 | } |
| 316 | } else | 302 | } |
| 317 | #endif /* UDF_RECOVERY */ | 303 | else |
| 304 | #endif /* UDF_RECOVERY */ | ||
| 318 | 305 | ||
| 319 | if (udf_find_entry(dir, dentry, &fibh, &cfi)) { | 306 | if (udf_find_entry(dir, dentry, &fibh, &cfi)) { |
| 320 | if (fibh.sbh != fibh.ebh) | 307 | if (fibh.sbh != fibh.ebh) |
| @@ -329,6 +316,7 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | |||
| 329 | } | 316 | } |
| 330 | unlock_kernel(); | 317 | unlock_kernel(); |
| 331 | d_add(dentry, inode); | 318 | d_add(dentry, inode); |
| 319 | |||
| 332 | return NULL; | 320 | return NULL; |
| 333 | } | 321 | } |
| 334 | 322 | ||
| @@ -352,7 +340,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 352 | kernel_lb_addr eloc; | 340 | kernel_lb_addr eloc; |
| 353 | uint32_t elen; | 341 | uint32_t elen; |
| 354 | sector_t offset; | 342 | sector_t offset; |
| 355 | struct extent_position epos = { NULL, 0, {0, 0} }; | 343 | struct extent_position epos = {}; |
| 356 | 344 | ||
| 357 | sb = dir->i_sb; | 345 | sb = dir->i_sb; |
| 358 | 346 | ||
| @@ -361,36 +349,33 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 361 | *err = -EINVAL; | 349 | *err = -EINVAL; |
| 362 | return NULL; | 350 | return NULL; |
| 363 | } | 351 | } |
| 364 | 352 | if (!(namelen = udf_put_filename(sb, dentry->d_name.name, name, | |
| 365 | if (! | 353 | dentry->d_name.len))) { |
| 366 | (namelen = | ||
| 367 | udf_put_filename(sb, dentry->d_name.name, name, | ||
| 368 | dentry->d_name.len))) { | ||
| 369 | *err = -ENAMETOOLONG; | 354 | *err = -ENAMETOOLONG; |
| 370 | return NULL; | 355 | return NULL; |
| 371 | } | 356 | } |
| 372 | } else | 357 | } else { |
| 373 | namelen = 0; | 358 | namelen = 0; |
| 359 | } | ||
| 374 | 360 | ||
| 375 | nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3; | 361 | nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3; |
| 376 | 362 | ||
| 377 | f_pos = (udf_ext0_offset(dir) >> 2); | 363 | f_pos = (udf_ext0_offset(dir) >> 2); |
| 378 | 364 | ||
| 379 | fibh->soffset = fibh->eoffset = | 365 | fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; |
| 380 | (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; | 366 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 381 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) | ||
| 382 | fibh->sbh = fibh->ebh = NULL; | 367 | fibh->sbh = fibh->ebh = NULL; |
| 383 | else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), | 368 | } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), |
| 384 | &epos, &eloc, &elen, | 369 | &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { |
| 385 | &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { | ||
| 386 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 370 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); |
| 387 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 371 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
| 388 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) | 372 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) |
| 389 | epos.offset -= sizeof(short_ad); | 373 | epos.offset -= sizeof(short_ad); |
| 390 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) | 374 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) |
| 391 | epos.offset -= sizeof(long_ad); | 375 | epos.offset -= sizeof(long_ad); |
| 392 | } else | 376 | } else { |
| 393 | offset = 0; | 377 | offset = 0; |
| 378 | } | ||
| 394 | 379 | ||
| 395 | if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) { | 380 | if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) { |
| 396 | brelse(epos.bh); | 381 | brelse(epos.bh); |
| @@ -423,40 +408,33 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 423 | liu = le16_to_cpu(cfi->lengthOfImpUse); | 408 | liu = le16_to_cpu(cfi->lengthOfImpUse); |
| 424 | lfi = cfi->lengthFileIdent; | 409 | lfi = cfi->lengthFileIdent; |
| 425 | 410 | ||
| 426 | if (fibh->sbh == fibh->ebh) | 411 | if (fibh->sbh == fibh->ebh) { |
| 427 | nameptr = fi->fileIdent + liu; | 412 | nameptr = fi->fileIdent + liu; |
| 428 | else { | 413 | } else { |
| 429 | int poffset; /* Unpaded ending offset */ | 414 | int poffset; /* Unpaded ending offset */ |
| 430 | 415 | ||
| 431 | poffset = | 416 | poffset = fibh->soffset + sizeof(struct fileIdentDesc) + liu + lfi; |
| 432 | fibh->soffset + sizeof(struct fileIdentDesc) + liu + | ||
| 433 | lfi; | ||
| 434 | 417 | ||
| 435 | if (poffset >= lfi) | 418 | if (poffset >= lfi) { |
| 436 | nameptr = | 419 | nameptr = (char *)(fibh->ebh->b_data + poffset - lfi); |
| 437 | (char *)(fibh->ebh->b_data + poffset - lfi); | 420 | } else { |
| 438 | else { | ||
| 439 | nameptr = fname; | 421 | nameptr = fname; |
| 440 | memcpy(nameptr, fi->fileIdent + liu, | 422 | memcpy(nameptr, fi->fileIdent + liu, lfi - poffset); |
| 441 | lfi - poffset); | 423 | memcpy(nameptr + lfi - poffset, fibh->ebh->b_data, poffset); |
| 442 | memcpy(nameptr + lfi - poffset, | ||
| 443 | fibh->ebh->b_data, poffset); | ||
| 444 | } | 424 | } |
| 445 | } | 425 | } |
| 446 | 426 | ||
| 447 | if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { | 427 | if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { |
| 448 | if (((sizeof(struct fileIdentDesc) + liu + lfi + | 428 | if (((sizeof(struct fileIdentDesc) + liu + lfi + 3) & ~3) == nfidlen) { |
| 449 | 3) & ~3) == nfidlen) { | ||
| 450 | brelse(epos.bh); | 429 | brelse(epos.bh); |
| 451 | cfi->descTag.tagSerialNum = cpu_to_le16(1); | 430 | cfi->descTag.tagSerialNum = cpu_to_le16(1); |
| 452 | cfi->fileVersionNum = cpu_to_le16(1); | 431 | cfi->fileVersionNum = cpu_to_le16(1); |
| 453 | cfi->fileCharacteristics = 0; | 432 | cfi->fileCharacteristics = 0; |
| 454 | cfi->lengthFileIdent = namelen; | 433 | cfi->lengthFileIdent = namelen; |
| 455 | cfi->lengthOfImpUse = cpu_to_le16(0); | 434 | cfi->lengthOfImpUse = cpu_to_le16(0); |
| 456 | if (!udf_write_fi | 435 | if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) { |
| 457 | (dir, cfi, fi, fibh, NULL, name)) | ||
| 458 | return fi; | 436 | return fi; |
| 459 | else { | 437 | } else { |
| 460 | *err = -EIO; | 438 | *err = -EIO; |
| 461 | return NULL; | 439 | return NULL; |
| 462 | } | 440 | } |
| @@ -467,8 +445,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 467 | continue; | 445 | continue; |
| 468 | 446 | ||
| 469 | if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi)) && | 447 | if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi)) && |
| 470 | udf_match(flen, fname, dentry->d_name.len, | 448 | udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name)) { |
| 471 | dentry->d_name.name)) { | ||
| 472 | if (fibh->sbh != fibh->ebh) | 449 | if (fibh->sbh != fibh->ebh) |
| 473 | brelse(fibh->ebh); | 450 | brelse(fibh->ebh); |
| 474 | brelse(fibh->sbh); | 451 | brelse(fibh->sbh); |
| @@ -478,7 +455,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 478 | } | 455 | } |
| 479 | } | 456 | } |
| 480 | 457 | ||
| 481 | add: | 458 | add: |
| 482 | f_pos += nfidlen; | 459 | f_pos += nfidlen; |
| 483 | 460 | ||
| 484 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB && | 461 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB && |
| @@ -491,14 +468,11 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 491 | if (fibh->sbh != fibh->ebh) | 468 | if (fibh->sbh != fibh->ebh) |
| 492 | brelse(fibh->ebh); | 469 | brelse(fibh->ebh); |
| 493 | brelse(fibh->sbh); | 470 | brelse(fibh->sbh); |
| 494 | if (! | 471 | if (!(fibh->sbh = fibh->ebh = udf_expand_dir_adinicb(dir, &block, err))) |
| 495 | (fibh->sbh = fibh->ebh = | ||
| 496 | udf_expand_dir_adinicb(dir, &block, err))) | ||
| 497 | return NULL; | 472 | return NULL; |
| 498 | epos.block = UDF_I_LOCATION(dir); | 473 | epos.block = UDF_I_LOCATION(dir); |
| 499 | eloc.logicalBlockNum = block; | 474 | eloc.logicalBlockNum = block; |
| 500 | eloc.partitionReferenceNum = | 475 | eloc.partitionReferenceNum = UDF_I_LOCATION(dir).partitionReferenceNum; |
| 501 | UDF_I_LOCATION(dir).partitionReferenceNum; | ||
| 502 | elen = dir->i_sb->s_blocksize; | 476 | elen = dir->i_sb->s_blocksize; |
| 503 | epos.offset = udf_file_entry_alloc_offset(dir); | 477 | epos.offset = udf_file_entry_alloc_offset(dir); |
| 504 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) | 478 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) |
| @@ -517,16 +491,13 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 517 | 491 | ||
| 518 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { | 492 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 519 | block = UDF_I_LOCATION(dir).logicalBlockNum; | 493 | block = UDF_I_LOCATION(dir).logicalBlockNum; |
| 520 | fi = (struct fileIdentDesc *)(UDF_I_DATA(dir) + | 494 | fi = (struct fileIdentDesc *)(UDF_I_DATA(dir) + fibh->soffset - |
| 521 | fibh->soffset - | ||
| 522 | udf_ext0_offset(dir) + | 495 | udf_ext0_offset(dir) + |
| 523 | UDF_I_LENEATTR(dir)); | 496 | UDF_I_LENEATTR(dir)); |
| 524 | } else { | 497 | } else { |
| 525 | block = eloc.logicalBlockNum + ((elen - 1) >> | 498 | block = eloc.logicalBlockNum + ((elen - 1) >> |
| 526 | dir->i_sb-> | 499 | dir->i_sb->s_blocksize_bits); |
| 527 | s_blocksize_bits); | 500 | fi = (struct fileIdentDesc *)(fibh->sbh->b_data + fibh->soffset); |
| 528 | fi = (struct fileIdentDesc *)(fibh->sbh->b_data + | ||
| 529 | fibh->soffset); | ||
| 530 | } | 501 | } |
| 531 | } else { | 502 | } else { |
| 532 | fibh->soffset = fibh->eoffset - sb->s_blocksize; | 503 | fibh->soffset = fibh->eoffset - sb->s_blocksize; |
| @@ -538,42 +509,36 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 538 | 509 | ||
| 539 | block = eloc.logicalBlockNum + ((elen - 1) >> | 510 | block = eloc.logicalBlockNum + ((elen - 1) >> |
| 540 | dir->i_sb->s_blocksize_bits); | 511 | dir->i_sb->s_blocksize_bits); |
| 541 | 512 | fibh->ebh = udf_bread(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 1, err); | |
| 542 | if (! | 513 | if (!fibh->ebh) { |
| 543 | (fibh->ebh = | ||
| 544 | udf_bread(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), | ||
| 545 | 1, err))) { | ||
| 546 | brelse(epos.bh); | 514 | brelse(epos.bh); |
| 547 | brelse(fibh->sbh); | 515 | brelse(fibh->sbh); |
| 548 | return NULL; | 516 | return NULL; |
| 549 | } | 517 | } |
| 550 | 518 | ||
| 551 | if (!(fibh->soffset)) { | 519 | if (!fibh->soffset) { |
| 552 | if (udf_next_aext(dir, &epos, &eloc, &elen, 1) == | 520 | if (udf_next_aext(dir, &epos, &eloc, &elen, 1) == |
| 553 | (EXT_RECORDED_ALLOCATED >> 30)) { | 521 | (EXT_RECORDED_ALLOCATED >> 30)) { |
| 554 | block = eloc.logicalBlockNum + ((elen - 1) >> | 522 | block = eloc.logicalBlockNum + ((elen - 1) >> |
| 555 | dir->i_sb-> | 523 | dir->i_sb->s_blocksize_bits); |
| 556 | s_blocksize_bits); | 524 | } else { |
| 557 | } else | ||
| 558 | block++; | 525 | block++; |
| 526 | } | ||
| 559 | 527 | ||
| 560 | brelse(fibh->sbh); | 528 | brelse(fibh->sbh); |
| 561 | fibh->sbh = fibh->ebh; | 529 | fibh->sbh = fibh->ebh; |
| 562 | fi = (struct fileIdentDesc *)(fibh->sbh->b_data); | 530 | fi = (struct fileIdentDesc *)(fibh->sbh->b_data); |
| 563 | } else { | 531 | } else { |
| 564 | fi = (struct fileIdentDesc *) | 532 | fi = (struct fileIdentDesc *) |
| 565 | (fibh->sbh->b_data + sb->s_blocksize + | 533 | (fibh->sbh->b_data + sb->s_blocksize + fibh->soffset); |
| 566 | fibh->soffset); | ||
| 567 | } | 534 | } |
| 568 | } | 535 | } |
| 569 | 536 | ||
| 570 | memset(cfi, 0, sizeof(struct fileIdentDesc)); | 537 | memset(cfi, 0, sizeof(struct fileIdentDesc)); |
| 571 | if (UDF_SB_UDFREV(sb) >= 0x0200) | 538 | if (UDF_SB_UDFREV(sb) >= 0x0200) |
| 572 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, | 539 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, sizeof(tag)); |
| 573 | sizeof(tag)); | ||
| 574 | else | 540 | else |
| 575 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, | 541 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, sizeof(tag)); |
| 576 | sizeof(tag)); | ||
| 577 | cfi->fileVersionNum = cpu_to_le16(1); | 542 | cfi->fileVersionNum = cpu_to_le16(1); |
| 578 | cfi->lengthFileIdent = namelen; | 543 | cfi->lengthFileIdent = namelen; |
| 579 | cfi->lengthOfImpUse = cpu_to_le16(0); | 544 | cfi->lengthOfImpUse = cpu_to_le16(0); |
| @@ -599,8 +564,10 @@ static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, | |||
| 599 | struct fileIdentDesc *cfi) | 564 | struct fileIdentDesc *cfi) |
| 600 | { | 565 | { |
| 601 | cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED; | 566 | cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED; |
| 567 | |||
| 602 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) | 568 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) |
| 603 | memset(&(cfi->icb), 0x00, sizeof(long_ad)); | 569 | memset(&(cfi->icb), 0x00, sizeof(long_ad)); |
| 570 | |||
| 604 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); | 571 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); |
| 605 | } | 572 | } |
| 606 | 573 | ||
| @@ -637,8 +604,8 @@ static int udf_create(struct inode *dir, struct dentry *dentry, int mode, | |||
| 637 | } | 604 | } |
| 638 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); | 605 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); |
| 639 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); | 606 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); |
| 640 | *(__le32 *) ((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 607 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 641 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); | 608 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); |
| 642 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 609 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
| 643 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { | 610 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 644 | mark_inode_dirty(dir); | 611 | mark_inode_dirty(dir); |
| @@ -648,6 +615,7 @@ static int udf_create(struct inode *dir, struct dentry *dentry, int mode, | |||
| 648 | brelse(fibh.sbh); | 615 | brelse(fibh.sbh); |
| 649 | unlock_kernel(); | 616 | unlock_kernel(); |
| 650 | d_instantiate(dentry, inode); | 617 | d_instantiate(dentry, inode); |
| 618 | |||
| 651 | return 0; | 619 | return 0; |
| 652 | } | 620 | } |
| 653 | 621 | ||
| @@ -679,8 +647,8 @@ static int udf_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
| 679 | } | 647 | } |
| 680 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); | 648 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); |
| 681 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); | 649 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); |
| 682 | *(__le32 *) ((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 650 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 683 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); | 651 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); |
| 684 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 652 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
| 685 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { | 653 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 686 | mark_inode_dirty(dir); | 654 | mark_inode_dirty(dir); |
| @@ -692,7 +660,8 @@ static int udf_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
| 692 | brelse(fibh.sbh); | 660 | brelse(fibh.sbh); |
| 693 | d_instantiate(dentry, inode); | 661 | d_instantiate(dentry, inode); |
| 694 | err = 0; | 662 | err = 0; |
| 695 | out: | 663 | |
| 664 | out: | ||
| 696 | unlock_kernel(); | 665 | unlock_kernel(); |
| 697 | return err; | 666 | return err; |
| 698 | } | 667 | } |
| @@ -725,10 +694,9 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 725 | inode->i_nlink = 2; | 694 | inode->i_nlink = 2; |
| 726 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); | 695 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); |
| 727 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(dir)); | 696 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(dir)); |
| 728 | *(__le32 *) ((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 697 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 729 | cpu_to_le32(UDF_I_UNIQUE(dir) & 0x00000000FFFFFFFFUL); | 698 | cpu_to_le32(UDF_I_UNIQUE(dir) & 0x00000000FFFFFFFFUL); |
| 730 | cfi.fileCharacteristics = | 699 | cfi.fileCharacteristics = FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT; |
| 731 | FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT; | ||
| 732 | udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL); | 700 | udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL); |
| 733 | brelse(fibh.sbh); | 701 | brelse(fibh.sbh); |
| 734 | inode->i_mode = S_IFDIR | mode; | 702 | inode->i_mode = S_IFDIR | mode; |
| @@ -744,8 +712,8 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 744 | } | 712 | } |
| 745 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); | 713 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); |
| 746 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); | 714 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); |
| 747 | *(__le32 *) ((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 715 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 748 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); | 716 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); |
| 749 | cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; | 717 | cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; |
| 750 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 718 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
| 751 | inc_nlink(dir); | 719 | inc_nlink(dir); |
| @@ -755,7 +723,8 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 755 | brelse(fibh.ebh); | 723 | brelse(fibh.ebh); |
| 756 | brelse(fibh.sbh); | 724 | brelse(fibh.sbh); |
| 757 | err = 0; | 725 | err = 0; |
| 758 | out: | 726 | |
| 727 | out: | ||
| 759 | unlock_kernel(); | 728 | unlock_kernel(); |
| 760 | return err; | 729 | return err; |
| 761 | } | 730 | } |
| @@ -770,26 +739,25 @@ static int empty_dir(struct inode *dir) | |||
| 770 | kernel_lb_addr eloc; | 739 | kernel_lb_addr eloc; |
| 771 | uint32_t elen; | 740 | uint32_t elen; |
| 772 | sector_t offset; | 741 | sector_t offset; |
| 773 | struct extent_position epos = { NULL, 0, {0, 0} }; | 742 | struct extent_position epos = {}; |
| 774 | 743 | ||
| 775 | f_pos = (udf_ext0_offset(dir) >> 2); | 744 | f_pos = (udf_ext0_offset(dir) >> 2); |
| 776 | 745 | ||
| 777 | fibh.soffset = fibh.eoffset = | 746 | fibh.soffset = fibh.eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; |
| 778 | (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; | ||
| 779 | 747 | ||
| 780 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) | 748 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 781 | fibh.sbh = fibh.ebh = NULL; | 749 | fibh.sbh = fibh.ebh = NULL; |
| 782 | else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), | 750 | } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), |
| 783 | &epos, &eloc, &elen, | 751 | &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { |
| 784 | &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { | ||
| 785 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 752 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); |
| 786 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 753 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
| 787 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) | 754 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) |
| 788 | epos.offset -= sizeof(short_ad); | 755 | epos.offset -= sizeof(short_ad); |
| 789 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) | 756 | else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) |
| 790 | epos.offset -= sizeof(long_ad); | 757 | epos.offset -= sizeof(long_ad); |
| 791 | } else | 758 | } else { |
| 792 | offset = 0; | 759 | offset = 0; |
| 760 | } | ||
| 793 | 761 | ||
| 794 | if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) { | 762 | if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) { |
| 795 | brelse(epos.bh); | 763 | brelse(epos.bh); |
| @@ -803,7 +771,6 @@ static int empty_dir(struct inode *dir) | |||
| 803 | while ((f_pos < size)) { | 771 | while ((f_pos < size)) { |
| 804 | fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc, | 772 | fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc, |
| 805 | &elen, &offset); | 773 | &elen, &offset); |
| 806 | |||
| 807 | if (!fi) { | 774 | if (!fi) { |
| 808 | if (fibh.sbh != fibh.ebh) | 775 | if (fibh.sbh != fibh.ebh) |
| 809 | brelse(fibh.ebh); | 776 | brelse(fibh.ebh); |
| @@ -812,8 +779,8 @@ static int empty_dir(struct inode *dir) | |||
| 812 | return 0; | 779 | return 0; |
| 813 | } | 780 | } |
| 814 | 781 | ||
| 815 | if (cfi.lengthFileIdent | 782 | if (cfi.lengthFileIdent && |
| 816 | && (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) { | 783 | (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) { |
| 817 | if (fibh.sbh != fibh.ebh) | 784 | if (fibh.sbh != fibh.ebh) |
| 818 | brelse(fibh.ebh); | 785 | brelse(fibh.ebh); |
| 819 | brelse(fibh.sbh); | 786 | brelse(fibh.sbh); |
| @@ -821,10 +788,12 @@ static int empty_dir(struct inode *dir) | |||
| 821 | return 0; | 788 | return 0; |
| 822 | } | 789 | } |
| 823 | } | 790 | } |
| 791 | |||
| 824 | if (fibh.sbh != fibh.ebh) | 792 | if (fibh.sbh != fibh.ebh) |
| 825 | brelse(fibh.ebh); | 793 | brelse(fibh.ebh); |
| 826 | brelse(fibh.sbh); | 794 | brelse(fibh.sbh); |
| 827 | brelse(epos.bh); | 795 | brelse(epos.bh); |
| 796 | |||
| 828 | return 1; | 797 | return 1; |
| 829 | } | 798 | } |
| 830 | 799 | ||
| @@ -859,15 +828,15 @@ static int udf_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 859 | clear_nlink(inode); | 828 | clear_nlink(inode); |
| 860 | inode->i_size = 0; | 829 | inode->i_size = 0; |
| 861 | inode_dec_link_count(dir); | 830 | inode_dec_link_count(dir); |
| 862 | inode->i_ctime = dir->i_ctime = dir->i_mtime = | 831 | inode->i_ctime = dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); |
| 863 | current_fs_time(dir->i_sb); | ||
| 864 | mark_inode_dirty(dir); | 832 | mark_inode_dirty(dir); |
| 865 | 833 | ||
| 866 | end_rmdir: | 834 | end_rmdir: |
| 867 | if (fibh.sbh != fibh.ebh) | 835 | if (fibh.sbh != fibh.ebh) |
| 868 | brelse(fibh.ebh); | 836 | brelse(fibh.ebh); |
| 869 | brelse(fibh.sbh); | 837 | brelse(fibh.sbh); |
| 870 | out: | 838 | |
| 839 | out: | ||
| 871 | unlock_kernel(); | 840 | unlock_kernel(); |
| 872 | return retval; | 841 | return retval; |
| 873 | } | 842 | } |
| @@ -906,11 +875,12 @@ static int udf_unlink(struct inode *dir, struct dentry *dentry) | |||
| 906 | inode->i_ctime = dir->i_ctime; | 875 | inode->i_ctime = dir->i_ctime; |
| 907 | retval = 0; | 876 | retval = 0; |
| 908 | 877 | ||
| 909 | end_unlink: | 878 | end_unlink: |
| 910 | if (fibh.sbh != fibh.ebh) | 879 | if (fibh.sbh != fibh.ebh) |
| 911 | brelse(fibh.ebh); | 880 | brelse(fibh.ebh); |
| 912 | brelse(fibh.sbh); | 881 | brelse(fibh.sbh); |
| 913 | out: | 882 | |
| 883 | out: | ||
| 914 | unlock_kernel(); | 884 | unlock_kernel(); |
| 915 | return retval; | 885 | return retval; |
| 916 | } | 886 | } |
| @@ -922,7 +892,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 922 | struct pathComponent *pc; | 892 | struct pathComponent *pc; |
| 923 | char *compstart; | 893 | char *compstart; |
| 924 | struct udf_fileident_bh fibh; | 894 | struct udf_fileident_bh fibh; |
| 925 | struct extent_position epos = { NULL, 0, {0, 0} }; | 895 | struct extent_position epos = {}; |
| 926 | int eoffset, elen = 0; | 896 | int eoffset, elen = 0; |
| 927 | struct fileIdentDesc *fi; | 897 | struct fileIdentDesc *fi; |
| 928 | struct fileIdentDesc cfi; | 898 | struct fileIdentDesc cfi; |
| @@ -945,26 +915,22 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 945 | uint32_t elen; | 915 | uint32_t elen; |
| 946 | 916 | ||
| 947 | block = udf_new_block(inode->i_sb, inode, | 917 | block = udf_new_block(inode->i_sb, inode, |
| 948 | UDF_I_LOCATION(inode). | 918 | UDF_I_LOCATION(inode).partitionReferenceNum, |
| 949 | partitionReferenceNum, | 919 | UDF_I_LOCATION(inode).logicalBlockNum, &err); |
| 950 | UDF_I_LOCATION(inode).logicalBlockNum, | ||
| 951 | &err); | ||
| 952 | if (!block) | 920 | if (!block) |
| 953 | goto out_no_entry; | 921 | goto out_no_entry; |
| 954 | epos.block = UDF_I_LOCATION(inode); | 922 | epos.block = UDF_I_LOCATION(inode); |
| 955 | epos.offset = udf_file_entry_alloc_offset(inode); | 923 | epos.offset = udf_file_entry_alloc_offset(inode); |
| 956 | epos.bh = NULL; | 924 | epos.bh = NULL; |
| 957 | eloc.logicalBlockNum = block; | 925 | eloc.logicalBlockNum = block; |
| 958 | eloc.partitionReferenceNum = | 926 | eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum; |
| 959 | UDF_I_LOCATION(inode).partitionReferenceNum; | ||
| 960 | elen = inode->i_sb->s_blocksize; | 927 | elen = inode->i_sb->s_blocksize; |
| 961 | UDF_I_LENEXTENTS(inode) = elen; | 928 | UDF_I_LENEXTENTS(inode) = elen; |
| 962 | udf_add_aext(inode, &epos, eloc, elen, 0); | 929 | udf_add_aext(inode, &epos, eloc, elen, 0); |
| 963 | brelse(epos.bh); | 930 | brelse(epos.bh); |
| 964 | 931 | ||
| 965 | block = udf_get_pblock(inode->i_sb, block, | 932 | block = udf_get_pblock(inode->i_sb, block, |
| 966 | UDF_I_LOCATION(inode). | 933 | UDF_I_LOCATION(inode).partitionReferenceNum, 0); |
| 967 | partitionReferenceNum, 0); | ||
| 968 | epos.bh = udf_tread(inode->i_sb, block); | 934 | epos.bh = udf_tread(inode->i_sb, block); |
| 969 | lock_buffer(epos.bh); | 935 | lock_buffer(epos.bh); |
| 970 | memset(epos.bh->b_data, 0x00, inode->i_sb->s_blocksize); | 936 | memset(epos.bh->b_data, 0x00, inode->i_sb->s_blocksize); |
| @@ -972,8 +938,9 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 972 | unlock_buffer(epos.bh); | 938 | unlock_buffer(epos.bh); |
| 973 | mark_buffer_dirty_inode(epos.bh, inode); | 939 | mark_buffer_dirty_inode(epos.bh, inode); |
| 974 | ea = epos.bh->b_data + udf_ext0_offset(inode); | 940 | ea = epos.bh->b_data + udf_ext0_offset(inode); |
| 975 | } else | 941 | } else { |
| 976 | ea = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode); | 942 | ea = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode); |
| 943 | } | ||
| 977 | 944 | ||
| 978 | eoffset = inode->i_sb->s_blocksize - udf_ext0_offset(inode); | 945 | eoffset = inode->i_sb->s_blocksize - udf_ext0_offset(inode); |
| 979 | pc = (struct pathComponent *)ea; | 946 | pc = (struct pathComponent *)ea; |
| @@ -1010,20 +977,17 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 1010 | if (compstart[0] == '.') { | 977 | if (compstart[0] == '.') { |
| 1011 | if ((symname - compstart) == 1) | 978 | if ((symname - compstart) == 1) |
| 1012 | pc->componentType = 4; | 979 | pc->componentType = 4; |
| 1013 | else if ((symname - compstart) == 2 | 980 | else if ((symname - compstart) == 2 && compstart[1] == '.') |
| 1014 | && compstart[1] == '.') | ||
| 1015 | pc->componentType = 3; | 981 | pc->componentType = 3; |
| 1016 | } | 982 | } |
| 1017 | 983 | ||
| 1018 | if (pc->componentType == 5) { | 984 | if (pc->componentType == 5) { |
| 1019 | if (! | 985 | namelen = udf_put_filename(inode->i_sb, compstart, name, |
| 1020 | (namelen = | 986 | symname - compstart); |
| 1021 | udf_put_filename(inode->i_sb, compstart, name, | 987 | if (!namelen) |
| 1022 | symname - compstart))) | ||
| 1023 | goto out_no_entry; | 988 | goto out_no_entry; |
| 1024 | 989 | ||
| 1025 | if (elen + sizeof(struct pathComponent) + namelen > | 990 | if (elen + sizeof(struct pathComponent) + namelen > eoffset) |
| 1026 | eoffset) | ||
| 1027 | goto out_no_entry; | 991 | goto out_no_entry; |
| 1028 | else | 992 | else |
| 1029 | pc->lengthComponentIdent = namelen; | 993 | pc->lengthComponentIdent = namelen; |
| @@ -1053,12 +1017,10 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 1053 | if (UDF_SB_LVIDBH(inode->i_sb)) { | 1017 | if (UDF_SB_LVIDBH(inode->i_sb)) { |
| 1054 | struct logicalVolHeaderDesc *lvhd; | 1018 | struct logicalVolHeaderDesc *lvhd; |
| 1055 | uint64_t uniqueID; | 1019 | uint64_t uniqueID; |
| 1056 | lvhd = | 1020 | lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse); |
| 1057 | (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)-> | ||
| 1058 | logicalVolContentsUse); | ||
| 1059 | uniqueID = le64_to_cpu(lvhd->uniqueID); | 1021 | uniqueID = le64_to_cpu(lvhd->uniqueID); |
| 1060 | *(__le32 *) ((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 1022 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 1061 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); | 1023 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); |
| 1062 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) | 1024 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) |
| 1063 | uniqueID += 16; | 1025 | uniqueID += 16; |
| 1064 | lvhd->uniqueID = cpu_to_le64(uniqueID); | 1026 | lvhd->uniqueID = cpu_to_le64(uniqueID); |
| @@ -1074,11 +1036,11 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 1074 | d_instantiate(dentry, inode); | 1036 | d_instantiate(dentry, inode); |
| 1075 | err = 0; | 1037 | err = 0; |
| 1076 | 1038 | ||
| 1077 | out: | 1039 | out: |
| 1078 | unlock_kernel(); | 1040 | unlock_kernel(); |
| 1079 | return err; | 1041 | return err; |
| 1080 | 1042 | ||
| 1081 | out_no_entry: | 1043 | out_no_entry: |
| 1082 | inode_dec_link_count(inode); | 1044 | inode_dec_link_count(inode); |
| 1083 | iput(inode); | 1045 | iput(inode); |
| 1084 | goto out; | 1046 | goto out; |
| @@ -1107,12 +1069,10 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1107 | if (UDF_SB_LVIDBH(inode->i_sb)) { | 1069 | if (UDF_SB_LVIDBH(inode->i_sb)) { |
| 1108 | struct logicalVolHeaderDesc *lvhd; | 1070 | struct logicalVolHeaderDesc *lvhd; |
| 1109 | uint64_t uniqueID; | 1071 | uint64_t uniqueID; |
| 1110 | lvhd = | 1072 | lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse); |
| 1111 | (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)-> | ||
| 1112 | logicalVolContentsUse); | ||
| 1113 | uniqueID = le64_to_cpu(lvhd->uniqueID); | 1073 | uniqueID = le64_to_cpu(lvhd->uniqueID); |
| 1114 | *(__le32 *) ((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 1074 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 1115 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); | 1075 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); |
| 1116 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) | 1076 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) |
| 1117 | uniqueID += 16; | 1077 | uniqueID += 16; |
| 1118 | lvhd->uniqueID = cpu_to_le64(uniqueID); | 1078 | lvhd->uniqueID = cpu_to_le64(uniqueID); |
| @@ -1122,6 +1082,7 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1122 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { | 1082 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| 1123 | mark_inode_dirty(dir); | 1083 | mark_inode_dirty(dir); |
| 1124 | } | 1084 | } |
| 1085 | |||
| 1125 | if (fibh.sbh != fibh.ebh) | 1086 | if (fibh.sbh != fibh.ebh) |
| 1126 | brelse(fibh.ebh); | 1087 | brelse(fibh.ebh); |
| 1127 | brelse(fibh.sbh); | 1088 | brelse(fibh.sbh); |
| @@ -1131,6 +1092,7 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1131 | atomic_inc(&inode->i_count); | 1092 | atomic_inc(&inode->i_count); |
| 1132 | d_instantiate(dentry, inode); | 1093 | d_instantiate(dentry, inode); |
| 1133 | unlock_kernel(); | 1094 | unlock_kernel(); |
| 1095 | |||
| 1134 | return 0; | 1096 | return 0; |
| 1135 | } | 1097 | } |
| 1136 | 1098 | ||
| @@ -1143,8 +1105,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1143 | struct inode *old_inode = old_dentry->d_inode; | 1105 | struct inode *old_inode = old_dentry->d_inode; |
| 1144 | struct inode *new_inode = new_dentry->d_inode; | 1106 | struct inode *new_inode = new_dentry->d_inode; |
| 1145 | struct udf_fileident_bh ofibh, nfibh; | 1107 | struct udf_fileident_bh ofibh, nfibh; |
| 1146 | struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = | 1108 | struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = NULL, ocfi, ncfi; |
| 1147 | NULL, ocfi, ncfi; | ||
| 1148 | struct buffer_head *dir_bh = NULL; | 1109 | struct buffer_head *dir_bh = NULL; |
| 1149 | int retval = -ENOENT; | 1110 | int retval = -ENOENT; |
| 1150 | kernel_lb_addr tloc; | 1111 | kernel_lb_addr tloc; |
| @@ -1181,36 +1142,27 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1181 | if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) { | 1142 | if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) { |
| 1182 | dir_fi = udf_get_fileident(UDF_I_DATA(old_inode) - | 1143 | dir_fi = udf_get_fileident(UDF_I_DATA(old_inode) - |
| 1183 | (UDF_I_EFE(old_inode) ? | 1144 | (UDF_I_EFE(old_inode) ? |
| 1184 | sizeof(struct | 1145 | sizeof(struct extendedFileEntry) : |
| 1185 | extendedFileEntry) : | ||
| 1186 | sizeof(struct fileEntry)), | 1146 | sizeof(struct fileEntry)), |
| 1187 | old_inode->i_sb->s_blocksize, | 1147 | old_inode->i_sb->s_blocksize, &offset); |
| 1188 | &offset); | ||
| 1189 | } else { | 1148 | } else { |
| 1190 | dir_bh = udf_bread(old_inode, 0, 0, &retval); | 1149 | dir_bh = udf_bread(old_inode, 0, 0, &retval); |
| 1191 | if (!dir_bh) | 1150 | if (!dir_bh) |
| 1192 | goto end_rename; | 1151 | goto end_rename; |
| 1193 | dir_fi = | 1152 | dir_fi = udf_get_fileident(dir_bh->b_data, old_inode->i_sb->s_blocksize, &offset); |
| 1194 | udf_get_fileident(dir_bh->b_data, | ||
| 1195 | old_inode->i_sb->s_blocksize, | ||
| 1196 | &offset); | ||
| 1197 | } | 1153 | } |
| 1198 | if (!dir_fi) | 1154 | if (!dir_fi) |
| 1199 | goto end_rename; | 1155 | goto end_rename; |
| 1200 | tloc = lelb_to_cpu(dir_fi->icb.extLocation); | 1156 | tloc = lelb_to_cpu(dir_fi->icb.extLocation); |
| 1201 | if (udf_get_lb_pblock(old_inode->i_sb, tloc, 0) | 1157 | if (udf_get_lb_pblock(old_inode->i_sb, tloc, 0) != old_dir->i_ino) |
| 1202 | != old_dir->i_ino) | ||
| 1203 | goto end_rename; | 1158 | goto end_rename; |
| 1204 | 1159 | ||
| 1205 | retval = -EMLINK; | 1160 | retval = -EMLINK; |
| 1206 | if (!new_inode | 1161 | if (!new_inode && new_dir->i_nlink >= (256 << sizeof(new_dir->i_nlink)) - 1) |
| 1207 | && new_dir->i_nlink >= | ||
| 1208 | (256 << sizeof(new_dir->i_nlink)) - 1) | ||
| 1209 | goto end_rename; | 1162 | goto end_rename; |
| 1210 | } | 1163 | } |
| 1211 | if (!nfi) { | 1164 | if (!nfi) { |
| 1212 | nfi = | 1165 | nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi, &retval); |
| 1213 | udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi, &retval); | ||
| 1214 | if (!nfi) | 1166 | if (!nfi) |
| 1215 | goto end_rename; | 1167 | goto end_rename; |
| 1216 | } | 1168 | } |
| @@ -1244,13 +1196,12 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1244 | if (dir_fi) { | 1196 | if (dir_fi) { |
| 1245 | dir_fi->icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(new_dir)); | 1197 | dir_fi->icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(new_dir)); |
| 1246 | udf_update_tag((char *)dir_fi, (sizeof(struct fileIdentDesc) + | 1198 | udf_update_tag((char *)dir_fi, (sizeof(struct fileIdentDesc) + |
| 1247 | le16_to_cpu(dir_fi-> | 1199 | le16_to_cpu(dir_fi->lengthOfImpUse) + 3) & ~3); |
| 1248 | lengthOfImpUse) + | ||
| 1249 | 3) & ~3); | ||
| 1250 | if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) { | 1200 | if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) { |
| 1251 | mark_inode_dirty(old_inode); | 1201 | mark_inode_dirty(old_inode); |
| 1252 | } else | 1202 | } else { |
| 1253 | mark_buffer_dirty_inode(dir_bh, old_inode); | 1203 | mark_buffer_dirty_inode(dir_bh, old_inode); |
| 1204 | } | ||
| 1254 | inode_dec_link_count(old_dir); | 1205 | inode_dec_link_count(old_dir); |
| 1255 | if (new_inode) { | 1206 | if (new_inode) { |
| 1256 | inode_dec_link_count(new_inode); | 1207 | inode_dec_link_count(new_inode); |
| @@ -1268,7 +1219,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1268 | 1219 | ||
| 1269 | retval = 0; | 1220 | retval = 0; |
| 1270 | 1221 | ||
| 1271 | end_rename: | 1222 | end_rename: |
| 1272 | brelse(dir_bh); | 1223 | brelse(dir_bh); |
| 1273 | if (nfi) { | 1224 | if (nfi) { |
| 1274 | if (nfibh.sbh != nfibh.ebh) | 1225 | if (nfibh.sbh != nfibh.ebh) |
| @@ -1276,17 +1227,18 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 1276 | brelse(nfibh.sbh); | 1227 | brelse(nfibh.sbh); |
| 1277 | } | 1228 | } |
| 1278 | unlock_kernel(); | 1229 | unlock_kernel(); |
| 1230 | |||
| 1279 | return retval; | 1231 | return retval; |
| 1280 | } | 1232 | } |
| 1281 | 1233 | ||
| 1282 | const struct inode_operations udf_dir_inode_operations = { | 1234 | const struct inode_operations udf_dir_inode_operations = { |
| 1283 | .lookup = udf_lookup, | 1235 | .lookup = udf_lookup, |
| 1284 | .create = udf_create, | 1236 | .create = udf_create, |
| 1285 | .link = udf_link, | 1237 | .link = udf_link, |
| 1286 | .unlink = udf_unlink, | 1238 | .unlink = udf_unlink, |
| 1287 | .symlink = udf_symlink, | 1239 | .symlink = udf_symlink, |
| 1288 | .mkdir = udf_mkdir, | 1240 | .mkdir = udf_mkdir, |
| 1289 | .rmdir = udf_rmdir, | 1241 | .rmdir = udf_rmdir, |
| 1290 | .mknod = udf_mknod, | 1242 | .mknod = udf_mknod, |
| 1291 | .rename = udf_rename, | 1243 | .rename = udf_rename, |
| 1292 | }; | 1244 | }; |
diff --git a/fs/udf/osta_udf.h b/fs/udf/osta_udf.h index bec5d340d8c5..65ff47902bd2 100644 --- a/fs/udf/osta_udf.h +++ b/fs/udf/osta_udf.h | |||
| @@ -66,64 +66,64 @@ | |||
| 66 | #define IS_DF_SOFT_WRITE_PROTECT 0x02 | 66 | #define IS_DF_SOFT_WRITE_PROTECT 0x02 |
| 67 | 67 | ||
| 68 | struct UDFIdentSuffix { | 68 | struct UDFIdentSuffix { |
| 69 | __le16 UDFRevision; | 69 | __le16 UDFRevision; |
| 70 | uint8_t OSClass; | 70 | uint8_t OSClass; |
| 71 | uint8_t OSIdentifier; | 71 | uint8_t OSIdentifier; |
| 72 | uint8_t reserved[4]; | 72 | uint8_t reserved[4]; |
| 73 | } __attribute__ ((packed)); | 73 | } __attribute__ ((packed)); |
| 74 | 74 | ||
| 75 | struct impIdentSuffix { | 75 | struct impIdentSuffix { |
| 76 | uint8_t OSClass; | 76 | uint8_t OSClass; |
| 77 | uint8_t OSIdentifier; | 77 | uint8_t OSIdentifier; |
| 78 | uint8_t reserved[6]; | 78 | uint8_t reserved[6]; |
| 79 | } __attribute__ ((packed)); | 79 | } __attribute__ ((packed)); |
| 80 | 80 | ||
| 81 | struct appIdentSuffix { | 81 | struct appIdentSuffix { |
| 82 | uint8_t impUse[8]; | 82 | uint8_t impUse[8]; |
| 83 | } __attribute__ ((packed)); | 83 | } __attribute__ ((packed)); |
| 84 | 84 | ||
| 85 | /* Logical Volume Integrity Descriptor (UDF 2.50 2.2.6) */ | 85 | /* Logical Volume Integrity Descriptor (UDF 2.50 2.2.6) */ |
| 86 | /* Implementation Use (UDF 2.50 2.2.6.4) */ | 86 | /* Implementation Use (UDF 2.50 2.2.6.4) */ |
| 87 | struct logicalVolIntegrityDescImpUse { | 87 | struct logicalVolIntegrityDescImpUse { |
| 88 | regid impIdent; | 88 | regid impIdent; |
| 89 | __le32 numFiles; | 89 | __le32 numFiles; |
| 90 | __le32 numDirs; | 90 | __le32 numDirs; |
| 91 | __le16 minUDFReadRev; | 91 | __le16 minUDFReadRev; |
| 92 | __le16 minUDFWriteRev; | 92 | __le16 minUDFWriteRev; |
| 93 | __le16 maxUDFWriteRev; | 93 | __le16 maxUDFWriteRev; |
| 94 | uint8_t impUse[0]; | 94 | uint8_t impUse[0]; |
| 95 | } __attribute__ ((packed)); | 95 | } __attribute__ ((packed)); |
| 96 | 96 | ||
| 97 | /* Implementation Use Volume Descriptor (UDF 2.50 2.2.7) */ | 97 | /* Implementation Use Volume Descriptor (UDF 2.50 2.2.7) */ |
| 98 | /* Implementation Use (UDF 2.50 2.2.7.2) */ | 98 | /* Implementation Use (UDF 2.50 2.2.7.2) */ |
| 99 | struct impUseVolDescImpUse { | 99 | struct impUseVolDescImpUse { |
| 100 | charspec LVICharset; | 100 | charspec LVICharset; |
| 101 | dstring logicalVolIdent[128]; | 101 | dstring logicalVolIdent[128]; |
| 102 | dstring LVInfo1[36]; | 102 | dstring LVInfo1[36]; |
| 103 | dstring LVInfo2[36]; | 103 | dstring LVInfo2[36]; |
| 104 | dstring LVInfo3[36]; | 104 | dstring LVInfo3[36]; |
| 105 | regid impIdent; | 105 | regid impIdent; |
| 106 | uint8_t impUse[128]; | 106 | uint8_t impUse[128]; |
| 107 | } __attribute__ ((packed)); | 107 | } __attribute__ ((packed)); |
| 108 | 108 | ||
| 109 | struct udfPartitionMap2 { | 109 | struct udfPartitionMap2 { |
| 110 | uint8_t partitionMapType; | 110 | uint8_t partitionMapType; |
| 111 | uint8_t partitionMapLength; | 111 | uint8_t partitionMapLength; |
| 112 | uint8_t reserved1[2]; | 112 | uint8_t reserved1[2]; |
| 113 | regid partIdent; | 113 | regid partIdent; |
| 114 | __le16 volSeqNum; | 114 | __le16 volSeqNum; |
| 115 | __le16 partitionNum; | 115 | __le16 partitionNum; |
| 116 | } __attribute__ ((packed)); | 116 | } __attribute__ ((packed)); |
| 117 | 117 | ||
| 118 | /* Virtual Partition Map (UDF 2.50 2.2.8) */ | 118 | /* Virtual Partition Map (UDF 2.50 2.2.8) */ |
| 119 | struct virtualPartitionMap { | 119 | struct virtualPartitionMap { |
| 120 | uint8_t partitionMapType; | 120 | uint8_t partitionMapType; |
| 121 | uint8_t partitionMapLength; | 121 | uint8_t partitionMapLength; |
| 122 | uint8_t reserved1[2]; | 122 | uint8_t reserved1[2]; |
| 123 | regid partIdent; | 123 | regid partIdent; |
| 124 | __le16 volSeqNum; | 124 | __le16 volSeqNum; |
| 125 | __le16 partitionNum; | 125 | __le16 partitionNum; |
| 126 | uint8_t reserved2[24]; | 126 | uint8_t reserved2[24]; |
| 127 | } __attribute__ ((packed)); | 127 | } __attribute__ ((packed)); |
| 128 | 128 | ||
| 129 | /* Sparable Partition Map (UDF 2.50 2.2.9) */ | 129 | /* Sparable Partition Map (UDF 2.50 2.2.9) */ |
| @@ -143,62 +143,62 @@ struct sparablePartitionMap { | |||
| 143 | 143 | ||
| 144 | /* Metadata Partition Map (UDF 2.4.0 2.2.10) */ | 144 | /* Metadata Partition Map (UDF 2.4.0 2.2.10) */ |
| 145 | struct metadataPartitionMap { | 145 | struct metadataPartitionMap { |
| 146 | uint8_t partitionMapType; | 146 | uint8_t partitionMapType; |
| 147 | uint8_t partitionMapLength; | 147 | uint8_t partitionMapLength; |
| 148 | uint8_t reserved1[2]; | 148 | uint8_t reserved1[2]; |
| 149 | regid partIdent; | 149 | regid partIdent; |
| 150 | __le16 volSeqNum; | 150 | __le16 volSeqNum; |
| 151 | __le16 partitionNum; | 151 | __le16 partitionNum; |
| 152 | __le32 metadataFileLoc; | 152 | __le32 metadataFileLoc; |
| 153 | __le32 metadataMirrorFileLoc; | 153 | __le32 metadataMirrorFileLoc; |
| 154 | __le32 metadataBitmapFileLoc; | 154 | __le32 metadataBitmapFileLoc; |
| 155 | __le32 allocUnitSize; | 155 | __le32 allocUnitSize; |
| 156 | __le16 alignUnitSize; | 156 | __le16 alignUnitSize; |
| 157 | uint8_t flags; | 157 | uint8_t flags; |
| 158 | uint8_t reserved2[5]; | 158 | uint8_t reserved2[5]; |
| 159 | } __attribute__ ((packed)); | 159 | } __attribute__ ((packed)); |
| 160 | 160 | ||
| 161 | /* Virtual Allocation Table (UDF 1.5 2.2.10) */ | 161 | /* Virtual Allocation Table (UDF 1.5 2.2.10) */ |
| 162 | struct virtualAllocationTable15 { | 162 | struct virtualAllocationTable15 { |
| 163 | __le32 VirtualSector[0]; | 163 | __le32 VirtualSector[0]; |
| 164 | regid vatIdent; | 164 | regid vatIdent; |
| 165 | __le32 previousVATICBLoc; | 165 | __le32 previousVATICBLoc; |
| 166 | } __attribute__ ((packed)); | 166 | } __attribute__ ((packed)); |
| 167 | 167 | ||
| 168 | #define ICBTAG_FILE_TYPE_VAT15 0x00U | 168 | #define ICBTAG_FILE_TYPE_VAT15 0x00U |
| 169 | 169 | ||
| 170 | /* Virtual Allocation Table (UDF 2.50 2.2.11) */ | 170 | /* Virtual Allocation Table (UDF 2.50 2.2.11) */ |
| 171 | struct virtualAllocationTable20 { | 171 | struct virtualAllocationTable20 { |
| 172 | __le16 lengthHeader; | 172 | __le16 lengthHeader; |
| 173 | __le16 lengthImpUse; | 173 | __le16 lengthImpUse; |
| 174 | dstring logicalVolIdent[128]; | 174 | dstring logicalVolIdent[128]; |
| 175 | __le32 previousVATICBLoc; | 175 | __le32 previousVATICBLoc; |
| 176 | __le32 numFiles; | 176 | __le32 numFiles; |
| 177 | __le32 numDirs; | 177 | __le32 numDirs; |
| 178 | __le16 minReadRevision; | 178 | __le16 minReadRevision; |
| 179 | __le16 minWriteRevision; | 179 | __le16 minWriteRevision; |
| 180 | __le16 maxWriteRevision; | 180 | __le16 maxWriteRevision; |
| 181 | __le16 reserved; | 181 | __le16 reserved; |
| 182 | uint8_t impUse[0]; | 182 | uint8_t impUse[0]; |
| 183 | __le32 vatEntry[0]; | 183 | __le32 vatEntry[0]; |
| 184 | } __attribute__ ((packed)); | 184 | } __attribute__ ((packed)); |
| 185 | 185 | ||
| 186 | #define ICBTAG_FILE_TYPE_VAT20 0xF8U | 186 | #define ICBTAG_FILE_TYPE_VAT20 0xF8U |
| 187 | 187 | ||
| 188 | /* Sparing Table (UDF 2.50 2.2.12) */ | 188 | /* Sparing Table (UDF 2.50 2.2.12) */ |
| 189 | struct sparingEntry { | 189 | struct sparingEntry { |
| 190 | __le32 origLocation; | 190 | __le32 origLocation; |
| 191 | __le32 mappedLocation; | 191 | __le32 mappedLocation; |
| 192 | } __attribute__ ((packed)); | 192 | } __attribute__ ((packed)); |
| 193 | 193 | ||
| 194 | struct sparingTable { | 194 | struct sparingTable { |
| 195 | tag descTag; | 195 | tag descTag; |
| 196 | regid sparingIdent; | 196 | regid sparingIdent; |
| 197 | __le16 reallocationTableLen; | 197 | __le16 reallocationTableLen; |
| 198 | __le16 reserved; | 198 | __le16 reserved; |
| 199 | __le32 sequenceNum; | 199 | __le32 sequenceNum; |
| 200 | struct sparingEntry | 200 | struct sparingEntry |
| 201 | mapEntry[0]; | 201 | mapEntry[0]; |
| 202 | } __attribute__ ((packed)); | 202 | } __attribute__ ((packed)); |
| 203 | 203 | ||
| 204 | /* Metadata File (and Metadata Mirror File) (UDF 2.50 2.2.13.1) */ | 204 | /* Metadata File (and Metadata Mirror File) (UDF 2.50 2.2.13.1) */ |
| @@ -208,8 +208,8 @@ struct sparingTable { | |||
| 208 | 208 | ||
| 209 | /* struct long_ad ICB - ADImpUse (UDF 2.50 2.2.4.3) */ | 209 | /* struct long_ad ICB - ADImpUse (UDF 2.50 2.2.4.3) */ |
| 210 | struct allocDescImpUse { | 210 | struct allocDescImpUse { |
| 211 | __le16 flags; | 211 | __le16 flags; |
| 212 | uint8_t impUse[4]; | 212 | uint8_t impUse[4]; |
| 213 | } __attribute__ ((packed)); | 213 | } __attribute__ ((packed)); |
| 214 | 214 | ||
| 215 | #define AD_IU_EXT_ERASED 0x0001 | 215 | #define AD_IU_EXT_ERASED 0x0001 |
| @@ -220,23 +220,23 @@ struct allocDescImpUse { | |||
| 220 | /* Implementation Use Extended Attribute (UDF 2.50 3.3.4.5) */ | 220 | /* Implementation Use Extended Attribute (UDF 2.50 3.3.4.5) */ |
| 221 | /* FreeEASpace (UDF 2.50 3.3.4.5.1.1) */ | 221 | /* FreeEASpace (UDF 2.50 3.3.4.5.1.1) */ |
| 222 | struct freeEaSpace { | 222 | struct freeEaSpace { |
| 223 | __le16 headerChecksum; | 223 | __le16 headerChecksum; |
| 224 | uint8_t freeEASpace[0]; | 224 | uint8_t freeEASpace[0]; |
| 225 | } __attribute__ ((packed)); | 225 | } __attribute__ ((packed)); |
| 226 | 226 | ||
| 227 | /* DVD Copyright Management Information (UDF 2.50 3.3.4.5.1.2) */ | 227 | /* DVD Copyright Management Information (UDF 2.50 3.3.4.5.1.2) */ |
| 228 | struct DVDCopyrightImpUse { | 228 | struct DVDCopyrightImpUse { |
| 229 | __le16 headerChecksum; | 229 | __le16 headerChecksum; |
| 230 | uint8_t CGMSInfo; | 230 | uint8_t CGMSInfo; |
| 231 | uint8_t dataType; | 231 | uint8_t dataType; |
| 232 | uint8_t protectionSystemInfo[4]; | 232 | uint8_t protectionSystemInfo[4]; |
| 233 | } __attribute__ ((packed)); | 233 | } __attribute__ ((packed)); |
| 234 | 234 | ||
| 235 | /* Application Use Extended Attribute (UDF 2.50 3.3.4.6) */ | 235 | /* Application Use Extended Attribute (UDF 2.50 3.3.4.6) */ |
| 236 | /* FreeAppEASpace (UDF 2.50 3.3.4.6.1) */ | 236 | /* FreeAppEASpace (UDF 2.50 3.3.4.6.1) */ |
| 237 | struct freeAppEASpace { | 237 | struct freeAppEASpace { |
| 238 | __le16 headerChecksum; | 238 | __le16 headerChecksum; |
| 239 | uint8_t freeEASpace[0]; | 239 | uint8_t freeEASpace[0]; |
| 240 | } __attribute__ ((packed)); | 240 | } __attribute__ ((packed)); |
| 241 | 241 | ||
| 242 | /* UDF Defined System Stream (UDF 2.50 3.3.7) */ | 242 | /* UDF Defined System Stream (UDF 2.50 3.3.7) */ |
| @@ -276,4 +276,4 @@ struct freeAppEASpace { | |||
| 276 | #define UDF_OS_ID_BEOS 0x00U | 276 | #define UDF_OS_ID_BEOS 0x00U |
| 277 | #define UDF_OS_ID_WINCE 0x00U | 277 | #define UDF_OS_ID_WINCE 0x00U |
| 278 | 278 | ||
| 279 | #endif /* _OSTA_UDF_H */ | 279 | #endif /* _OSTA_UDF_H */ |
diff --git a/fs/udf/partition.c b/fs/udf/partition.c index a95d830a674d..aaab24c8c498 100644 --- a/fs/udf/partition.c +++ b/fs/udf/partition.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | * | 14 | * |
| 15 | * HISTORY | 15 | * HISTORY |
| 16 | * | 16 | * |
| 17 | * 12/06/98 blf Created file. | 17 | * 12/06/98 blf Created file. |
| 18 | * | 18 | * |
| 19 | */ | 19 | */ |
| 20 | 20 | ||
| @@ -32,19 +32,17 @@ inline uint32_t udf_get_pblock(struct super_block *sb, uint32_t block, | |||
| 32 | uint16_t partition, uint32_t offset) | 32 | uint16_t partition, uint32_t offset) |
| 33 | { | 33 | { |
| 34 | if (partition >= UDF_SB_NUMPARTS(sb)) { | 34 | if (partition >= UDF_SB_NUMPARTS(sb)) { |
| 35 | udf_debug | 35 | udf_debug("block=%d, partition=%d, offset=%d: invalid partition\n", |
| 36 | ("block=%d, partition=%d, offset=%d: invalid partition\n", | 36 | block, partition, offset); |
| 37 | block, partition, offset); | ||
| 38 | return 0xFFFFFFFF; | 37 | return 0xFFFFFFFF; |
| 39 | } | 38 | } |
| 40 | if (UDF_SB_PARTFUNC(sb, partition)) | 39 | if (UDF_SB_PARTFUNC(sb, partition)) |
| 41 | return UDF_SB_PARTFUNC(sb, partition) (sb, block, partition, | 40 | return UDF_SB_PARTFUNC(sb, partition)(sb, block, partition, offset); |
| 42 | offset); | ||
| 43 | else | 41 | else |
| 44 | return UDF_SB_PARTROOT(sb, partition) + block + offset; | 42 | return UDF_SB_PARTROOT(sb, partition) + block + offset; |
| 45 | } | 43 | } |
| 46 | 44 | ||
| 47 | uint32_t udf_get_pblock_virt15(struct super_block * sb, uint32_t block, | 45 | uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block, |
| 48 | uint16_t partition, uint32_t offset) | 46 | uint16_t partition, uint32_t offset) |
| 49 | { | 47 | { |
| 50 | struct buffer_head *bh = NULL; | 48 | struct buffer_head *bh = NULL; |
| @@ -52,14 +50,11 @@ uint32_t udf_get_pblock_virt15(struct super_block * sb, uint32_t block, | |||
| 52 | uint32_t index; | 50 | uint32_t index; |
| 53 | uint32_t loc; | 51 | uint32_t loc; |
| 54 | 52 | ||
| 55 | index = | 53 | index = (sb->s_blocksize - UDF_SB_TYPEVIRT(sb,partition).s_start_offset) / sizeof(uint32_t); |
| 56 | (sb->s_blocksize - | ||
| 57 | UDF_SB_TYPEVIRT(sb, partition).s_start_offset) / sizeof(uint32_t); | ||
| 58 | 54 | ||
| 59 | if (block > UDF_SB_TYPEVIRT(sb, partition).s_num_entries) { | 55 | if (block > UDF_SB_TYPEVIRT(sb,partition).s_num_entries) { |
| 60 | udf_debug | 56 | udf_debug("Trying to access block beyond end of VAT (%d max %d)\n", |
| 61 | ("Trying to access block beyond end of VAT (%d max %d)\n", | 57 | block, UDF_SB_TYPEVIRT(sb,partition).s_num_entries); |
| 62 | block, UDF_SB_TYPEVIRT(sb, partition).s_num_entries); | ||
| 63 | return 0xFFFFFFFF; | 58 | return 0xFFFFFFFF; |
| 64 | } | 59 | } |
| 65 | 60 | ||
| @@ -69,10 +64,7 @@ uint32_t udf_get_pblock_virt15(struct super_block * sb, uint32_t block, | |||
| 69 | index = block % (sb->s_blocksize / sizeof(uint32_t)); | 64 | index = block % (sb->s_blocksize / sizeof(uint32_t)); |
| 70 | } else { | 65 | } else { |
| 71 | newblock = 0; | 66 | newblock = 0; |
| 72 | index = | 67 | index = UDF_SB_TYPEVIRT(sb,partition).s_start_offset / sizeof(uint32_t) + block; |
| 73 | UDF_SB_TYPEVIRT(sb, | ||
| 74 | partition).s_start_offset / | ||
| 75 | sizeof(uint32_t) + block; | ||
| 76 | } | 68 | } |
| 77 | 69 | ||
| 78 | loc = udf_block_map(UDF_SB_VAT(sb), newblock); | 70 | loc = udf_block_map(UDF_SB_VAT(sb), newblock); |
| @@ -83,7 +75,7 @@ uint32_t udf_get_pblock_virt15(struct super_block * sb, uint32_t block, | |||
| 83 | return 0xFFFFFFFF; | 75 | return 0xFFFFFFFF; |
| 84 | } | 76 | } |
| 85 | 77 | ||
| 86 | loc = le32_to_cpu(((__le32 *) bh->b_data)[index]); | 78 | loc = le32_to_cpu(((__le32 *)bh->b_data)[index]); |
| 87 | 79 | ||
| 88 | brelse(bh); | 80 | brelse(bh); |
| 89 | 81 | ||
| @@ -93,8 +85,8 @@ uint32_t udf_get_pblock_virt15(struct super_block * sb, uint32_t block, | |||
| 93 | } | 85 | } |
| 94 | 86 | ||
| 95 | return udf_get_pblock(sb, loc, | 87 | return udf_get_pblock(sb, loc, |
| 96 | UDF_I_LOCATION(UDF_SB_VAT(sb)). | 88 | UDF_I_LOCATION(UDF_SB_VAT(sb)).partitionReferenceNum, |
| 97 | partitionReferenceNum, offset); | 89 | offset); |
| 98 | } | 90 | } |
| 99 | 91 | ||
| 100 | inline uint32_t udf_get_pblock_virt20(struct super_block * sb, uint32_t block, | 92 | inline uint32_t udf_get_pblock_virt20(struct super_block * sb, uint32_t block, |
| @@ -108,40 +100,29 @@ uint32_t udf_get_pblock_spar15(struct super_block * sb, uint32_t block, | |||
| 108 | { | 100 | { |
| 109 | int i; | 101 | int i; |
| 110 | struct sparingTable *st = NULL; | 102 | struct sparingTable *st = NULL; |
| 111 | uint32_t packet = | 103 | uint32_t packet = (block + offset) & ~(UDF_SB_TYPESPAR(sb,partition).s_packet_len - 1); |
| 112 | (block + offset) & ~(UDF_SB_TYPESPAR(sb, partition).s_packet_len - | ||
| 113 | 1); | ||
| 114 | 104 | ||
| 115 | for (i = 0; i < 4; i++) { | 105 | for (i = 0; i < 4; i++) { |
| 116 | if (UDF_SB_TYPESPAR(sb, partition).s_spar_map[i] != NULL) { | 106 | if (UDF_SB_TYPESPAR(sb,partition).s_spar_map[i] != NULL) { |
| 117 | st = (struct sparingTable *)UDF_SB_TYPESPAR(sb, | 107 | st = (struct sparingTable *)UDF_SB_TYPESPAR(sb,partition).s_spar_map[i]->b_data; |
| 118 | partition). | ||
| 119 | s_spar_map[i]->b_data; | ||
| 120 | break; | 108 | break; |
| 121 | } | 109 | } |
| 122 | } | 110 | } |
| 123 | 111 | ||
| 124 | if (st) { | 112 | if (st) { |
| 125 | for (i = 0; i < le16_to_cpu(st->reallocationTableLen); i++) { | 113 | for (i = 0; i < le16_to_cpu(st->reallocationTableLen); i++) { |
| 126 | if (le32_to_cpu(st->mapEntry[i].origLocation) >= | 114 | if (le32_to_cpu(st->mapEntry[i].origLocation) >= 0xFFFFFFF0) { |
| 127 | 0xFFFFFFF0) | ||
| 128 | break; | 115 | break; |
| 129 | else if (le32_to_cpu(st->mapEntry[i].origLocation) == | 116 | } else if (le32_to_cpu(st->mapEntry[i].origLocation) == packet) { |
| 130 | packet) { | 117 | return le32_to_cpu(st->mapEntry[i].mappedLocation) + |
| 131 | return le32_to_cpu(st->mapEntry[i]. | 118 | ((block + offset) & (UDF_SB_TYPESPAR(sb,partition).s_packet_len - 1)); |
| 132 | mappedLocation) + ((block + | 119 | } else if (le32_to_cpu(st->mapEntry[i].origLocation) > packet) { |
| 133 | offset) & | ||
| 134 | (UDF_SB_TYPESPAR | ||
| 135 | (sb, | ||
| 136 | partition). | ||
| 137 | s_packet_len | ||
| 138 | - 1)); | ||
| 139 | } else if (le32_to_cpu(st->mapEntry[i].origLocation) > | ||
| 140 | packet) | ||
| 141 | break; | 120 | break; |
| 121 | } | ||
| 142 | } | 122 | } |
| 143 | } | 123 | } |
| 144 | return UDF_SB_PARTROOT(sb, partition) + block + offset; | 124 | |
| 125 | return UDF_SB_PARTROOT(sb,partition) + block + offset; | ||
| 145 | } | 126 | } |
| 146 | 127 | ||
| 147 | int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | 128 | int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) |
| @@ -153,20 +134,14 @@ int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | |||
| 153 | int i, j, k, l; | 134 | int i, j, k, l; |
| 154 | 135 | ||
| 155 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { | 136 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { |
| 156 | if (old_block > UDF_SB_PARTROOT(sb, i) && | 137 | if (old_block > UDF_SB_PARTROOT(sb,i) && |
| 157 | old_block < UDF_SB_PARTROOT(sb, i) + UDF_SB_PARTLEN(sb, i)) | 138 | old_block < UDF_SB_PARTROOT(sb,i) + UDF_SB_PARTLEN(sb,i)) { |
| 158 | { | 139 | sdata = &UDF_SB_TYPESPAR(sb,i); |
| 159 | sdata = &UDF_SB_TYPESPAR(sb, i); | 140 | packet = (old_block - UDF_SB_PARTROOT(sb,i)) & ~(sdata->s_packet_len - 1); |
| 160 | packet = | ||
| 161 | (old_block - | ||
| 162 | UDF_SB_PARTROOT(sb, | ||
| 163 | i)) & ~(sdata->s_packet_len - 1); | ||
| 164 | 141 | ||
| 165 | for (j = 0; j < 4; j++) { | 142 | for (j = 0; j < 4; j++) { |
| 166 | if (UDF_SB_TYPESPAR(sb, i).s_spar_map[j] != | 143 | if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL) { |
| 167 | NULL) { | 144 | st = (struct sparingTable *)sdata->s_spar_map[j]->b_data; |
| 168 | st = (struct sparingTable *)sdata-> | ||
| 169 | s_spar_map[j]->b_data; | ||
| 170 | break; | 145 | break; |
| 171 | } | 146 | } |
| 172 | } | 147 | } |
| @@ -174,122 +149,51 @@ int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | |||
| 174 | if (!st) | 149 | if (!st) |
| 175 | return 1; | 150 | return 1; |
| 176 | 151 | ||
| 177 | for (k = 0; k < le16_to_cpu(st->reallocationTableLen); | 152 | for (k = 0; k < le16_to_cpu(st->reallocationTableLen); k++) { |
| 178 | k++) { | 153 | if (le32_to_cpu(st->mapEntry[k].origLocation) == 0xFFFFFFFF) { |
| 179 | if (le32_to_cpu(st->mapEntry[k].origLocation) == | ||
| 180 | 0xFFFFFFFF) { | ||
| 181 | for (; j < 4; j++) { | 154 | for (; j < 4; j++) { |
| 182 | if (sdata->s_spar_map[j]) { | 155 | if (sdata->s_spar_map[j]) { |
| 183 | st = (struct | 156 | st = (struct sparingTable *)sdata->s_spar_map[j]->b_data; |
| 184 | sparingTable *) | 157 | st->mapEntry[k].origLocation = cpu_to_le32(packet); |
| 185 | sdata-> | 158 | udf_update_tag((char *)st, sizeof(struct sparingTable) + le16_to_cpu(st->reallocationTableLen) * sizeof(struct sparingEntry)); |
| 186 | s_spar_map[j]-> | 159 | mark_buffer_dirty(sdata->s_spar_map[j]); |
| 187 | b_data; | ||
| 188 | st->mapEntry[k]. | ||
| 189 | origLocation = | ||
| 190 | cpu_to_le32(packet); | ||
| 191 | udf_update_tag((char *) | ||
| 192 | st, | ||
| 193 | sizeof | ||
| 194 | (struct | ||
| 195 | sparingTable) | ||
| 196 | + | ||
| 197 | le16_to_cpu | ||
| 198 | (st-> | ||
| 199 | reallocationTableLen) | ||
| 200 | * | ||
| 201 | sizeof | ||
| 202 | (struct | ||
| 203 | sparingEntry)); | ||
| 204 | mark_buffer_dirty | ||
| 205 | (sdata-> | ||
| 206 | s_spar_map[j]); | ||
| 207 | } | 160 | } |
| 208 | } | 161 | } |
| 209 | *new_block = | 162 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + |
| 210 | le32_to_cpu(st->mapEntry[k]. | 163 | ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); |
| 211 | mappedLocation) + | ||
| 212 | ((old_block - | ||
| 213 | UDF_SB_PARTROOT(sb, | ||
| 214 | i)) & (sdata-> | ||
| 215 | s_packet_len | ||
| 216 | - 1)); | ||
| 217 | return 0; | 164 | return 0; |
| 218 | } else | 165 | } else if (le32_to_cpu(st->mapEntry[k].origLocation) == packet) { |
| 219 | if (le32_to_cpu | 166 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + |
| 220 | (st->mapEntry[k].origLocation) == | 167 | ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); |
| 221 | packet) { | ||
| 222 | *new_block = | ||
| 223 | le32_to_cpu(st->mapEntry[k]. | ||
| 224 | mappedLocation) + | ||
| 225 | ((old_block - | ||
| 226 | UDF_SB_PARTROOT(sb, | ||
| 227 | i)) & (sdata-> | ||
| 228 | s_packet_len | ||
| 229 | - 1)); | ||
| 230 | return 0; | 168 | return 0; |
| 231 | } else | 169 | } else if (le32_to_cpu(st->mapEntry[k].origLocation) > packet) { |
| 232 | if (le32_to_cpu | ||
| 233 | (st->mapEntry[k].origLocation) > packet) | ||
| 234 | break; | 170 | break; |
| 171 | } | ||
| 235 | } | 172 | } |
| 236 | for (l = k; l < le16_to_cpu(st->reallocationTableLen); | 173 | |
| 237 | l++) { | 174 | for (l = k; l < le16_to_cpu(st->reallocationTableLen); l++) { |
| 238 | if (le32_to_cpu(st->mapEntry[l].origLocation) == | 175 | if (le32_to_cpu(st->mapEntry[l].origLocation) == 0xFFFFFFFF) { |
| 239 | 0xFFFFFFFF) { | ||
| 240 | for (; j < 4; j++) { | 176 | for (; j < 4; j++) { |
| 241 | if (sdata->s_spar_map[j]) { | 177 | if (sdata->s_spar_map[j]) { |
| 242 | st = (struct | 178 | st = (struct sparingTable *)sdata->s_spar_map[j]->b_data; |
| 243 | sparingTable *) | 179 | mapEntry = st->mapEntry[l]; |
| 244 | sdata-> | 180 | mapEntry.origLocation = cpu_to_le32(packet); |
| 245 | s_spar_map[j]-> | 181 | memmove(&st->mapEntry[k + 1], &st->mapEntry[k], (l - k) * sizeof(struct sparingEntry)); |
| 246 | b_data; | 182 | st->mapEntry[k] = mapEntry; |
| 247 | mapEntry = | 183 | udf_update_tag((char *)st, sizeof(struct sparingTable) + le16_to_cpu(st->reallocationTableLen) * sizeof(struct sparingEntry)); |
| 248 | st->mapEntry[l]; | 184 | mark_buffer_dirty(sdata->s_spar_map[j]); |
| 249 | mapEntry.origLocation = | ||
| 250 | cpu_to_le32(packet); | ||
| 251 | memmove(&st-> | ||
| 252 | mapEntry[k + 1], | ||
| 253 | &st-> | ||
| 254 | mapEntry[k], | ||
| 255 | (l - | ||
| 256 | k) * | ||
| 257 | sizeof(struct | ||
| 258 | sparingEntry)); | ||
| 259 | st->mapEntry[k] = | ||
| 260 | mapEntry; | ||
| 261 | udf_update_tag((char *) | ||
| 262 | st, | ||
| 263 | sizeof | ||
| 264 | (struct | ||
| 265 | sparingTable) | ||
| 266 | + | ||
| 267 | le16_to_cpu | ||
| 268 | (st-> | ||
| 269 | reallocationTableLen) | ||
| 270 | * | ||
| 271 | sizeof | ||
| 272 | (struct | ||
| 273 | sparingEntry)); | ||
| 274 | mark_buffer_dirty | ||
| 275 | (sdata-> | ||
| 276 | s_spar_map[j]); | ||
| 277 | } | 185 | } |
| 278 | } | 186 | } |
| 279 | *new_block = | 187 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + |
| 280 | le32_to_cpu(st->mapEntry[k]. | 188 | ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); |
| 281 | mappedLocation) + | ||
| 282 | ((old_block - | ||
| 283 | UDF_SB_PARTROOT(sb, | ||
| 284 | i)) & (sdata-> | ||
| 285 | s_packet_len | ||
| 286 | - 1)); | ||
| 287 | return 0; | 189 | return 0; |
| 288 | } | 190 | } |
| 289 | } | 191 | } |
| 192 | |||
| 290 | return 1; | 193 | return 1; |
| 291 | } | 194 | } /* if old_block */ |
| 292 | } | 195 | } |
| 196 | |||
| 293 | if (i == UDF_SB_NUMPARTS(sb)) { | 197 | if (i == UDF_SB_NUMPARTS(sb)) { |
| 294 | /* outside of partitions */ | 198 | /* outside of partitions */ |
| 295 | /* for now, fail =) */ | 199 | /* for now, fail =) */ |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 72097ee6b752..7b30964665db 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -104,11 +104,11 @@ static int udf_get_sb(struct file_system_type *fs_type, | |||
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | static struct file_system_type udf_fstype = { | 106 | static struct file_system_type udf_fstype = { |
| 107 | .owner = THIS_MODULE, | 107 | .owner = THIS_MODULE, |
| 108 | .name = "udf", | 108 | .name = "udf", |
| 109 | .get_sb = udf_get_sb, | 109 | .get_sb = udf_get_sb, |
| 110 | .kill_sb = kill_block_super, | 110 | .kill_sb = kill_block_super, |
| 111 | .fs_flags = FS_REQUIRES_DEV, | 111 | .fs_flags = FS_REQUIRES_DEV, |
| 112 | }; | 112 | }; |
| 113 | 113 | ||
| 114 | static struct kmem_cache *udf_inode_cachep; | 114 | static struct kmem_cache *udf_inode_cachep; |
| @@ -116,8 +116,7 @@ static struct kmem_cache *udf_inode_cachep; | |||
| 116 | static struct inode *udf_alloc_inode(struct super_block *sb) | 116 | static struct inode *udf_alloc_inode(struct super_block *sb) |
| 117 | { | 117 | { |
| 118 | struct udf_inode_info *ei; | 118 | struct udf_inode_info *ei; |
| 119 | ei = (struct udf_inode_info *)kmem_cache_alloc(udf_inode_cachep, | 119 | ei = (struct udf_inode_info *)kmem_cache_alloc(udf_inode_cachep, GFP_KERNEL); |
| 120 | GFP_KERNEL); | ||
| 121 | if (!ei) | 120 | if (!ei) |
| 122 | return NULL; | 121 | return NULL; |
| 123 | 122 | ||
| @@ -150,7 +149,7 @@ static int init_inodecache(void) | |||
| 150 | 0, (SLAB_RECLAIM_ACCOUNT | | 149 | 0, (SLAB_RECLAIM_ACCOUNT | |
| 151 | SLAB_MEM_SPREAD), | 150 | SLAB_MEM_SPREAD), |
| 152 | init_once); | 151 | init_once); |
| 153 | if (udf_inode_cachep == NULL) | 152 | if (!udf_inode_cachep) |
| 154 | return -ENOMEM; | 153 | return -ENOMEM; |
| 155 | return 0; | 154 | return 0; |
| 156 | } | 155 | } |
| @@ -162,15 +161,15 @@ static void destroy_inodecache(void) | |||
| 162 | 161 | ||
| 163 | /* Superblock operations */ | 162 | /* Superblock operations */ |
| 164 | static const struct super_operations udf_sb_ops = { | 163 | static const struct super_operations udf_sb_ops = { |
| 165 | .alloc_inode = udf_alloc_inode, | 164 | .alloc_inode = udf_alloc_inode, |
| 166 | .destroy_inode = udf_destroy_inode, | 165 | .destroy_inode = udf_destroy_inode, |
| 167 | .write_inode = udf_write_inode, | 166 | .write_inode = udf_write_inode, |
| 168 | .delete_inode = udf_delete_inode, | 167 | .delete_inode = udf_delete_inode, |
| 169 | .clear_inode = udf_clear_inode, | 168 | .clear_inode = udf_clear_inode, |
| 170 | .put_super = udf_put_super, | 169 | .put_super = udf_put_super, |
| 171 | .write_super = udf_write_super, | 170 | .write_super = udf_write_super, |
| 172 | .statfs = udf_statfs, | 171 | .statfs = udf_statfs, |
| 173 | .remount_fs = udf_remount_fs, | 172 | .remount_fs = udf_remount_fs, |
| 174 | }; | 173 | }; |
| 175 | 174 | ||
| 176 | struct udf_options { | 175 | struct udf_options { |
| @@ -193,16 +192,20 @@ struct udf_options { | |||
| 193 | static int __init init_udf_fs(void) | 192 | static int __init init_udf_fs(void) |
| 194 | { | 193 | { |
| 195 | int err; | 194 | int err; |
| 195 | |||
| 196 | err = init_inodecache(); | 196 | err = init_inodecache(); |
| 197 | if (err) | 197 | if (err) |
| 198 | goto out1; | 198 | goto out1; |
| 199 | err = register_filesystem(&udf_fstype); | 199 | err = register_filesystem(&udf_fstype); |
| 200 | if (err) | 200 | if (err) |
| 201 | goto out; | 201 | goto out; |
| 202 | |||
| 202 | return 0; | 203 | return 0; |
| 203 | out: | 204 | |
| 205 | out: | ||
| 204 | destroy_inodecache(); | 206 | destroy_inodecache(); |
| 205 | out1: | 207 | |
| 208 | out1: | ||
| 206 | return err; | 209 | return err; |
| 207 | } | 210 | } |
| 208 | 211 | ||
| @@ -213,7 +216,7 @@ static void __exit exit_udf_fs(void) | |||
| 213 | } | 216 | } |
| 214 | 217 | ||
| 215 | module_init(init_udf_fs) | 218 | module_init(init_udf_fs) |
| 216 | module_exit(exit_udf_fs) | 219 | module_exit(exit_udf_fs) |
| 217 | 220 | ||
| 218 | /* | 221 | /* |
| 219 | * udf_parse_options | 222 | * udf_parse_options |
| @@ -239,7 +242,7 @@ module_init(init_udf_fs) | |||
| 239 | * | 242 | * |
| 240 | * The remaining are for debugging and disaster recovery: | 243 | * The remaining are for debugging and disaster recovery: |
| 241 | * | 244 | * |
| 242 | * novrs Skip volume sequence recognition | 245 | * novrs Skip volume sequence recognition |
| 243 | * | 246 | * |
| 244 | * The following expect a offset from 0. | 247 | * The following expect a offset from 0. |
| 245 | * | 248 | * |
| @@ -268,6 +271,7 @@ module_init(init_udf_fs) | |||
| 268 | * July 1, 1997 - Andrew E. Mileski | 271 | * July 1, 1997 - Andrew E. Mileski |
| 269 | * Written, tested, and released. | 272 | * Written, tested, and released. |
| 270 | */ | 273 | */ |
| 274 | |||
| 271 | enum { | 275 | enum { |
| 272 | Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete, | 276 | Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete, |
| 273 | Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad, | 277 | Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad, |
| @@ -278,32 +282,32 @@ enum { | |||
| 278 | }; | 282 | }; |
| 279 | 283 | ||
| 280 | static match_table_t tokens = { | 284 | static match_table_t tokens = { |
| 281 | {Opt_novrs, "novrs"}, | 285 | {Opt_novrs, "novrs"}, |
| 282 | {Opt_nostrict, "nostrict"}, | 286 | {Opt_nostrict, "nostrict"}, |
| 283 | {Opt_bs, "bs=%u"}, | 287 | {Opt_bs, "bs=%u"}, |
| 284 | {Opt_unhide, "unhide"}, | 288 | {Opt_unhide, "unhide"}, |
| 285 | {Opt_undelete, "undelete"}, | 289 | {Opt_undelete, "undelete"}, |
| 286 | {Opt_noadinicb, "noadinicb"}, | 290 | {Opt_noadinicb, "noadinicb"}, |
| 287 | {Opt_adinicb, "adinicb"}, | 291 | {Opt_adinicb, "adinicb"}, |
| 288 | {Opt_shortad, "shortad"}, | 292 | {Opt_shortad, "shortad"}, |
| 289 | {Opt_longad, "longad"}, | 293 | {Opt_longad, "longad"}, |
| 290 | {Opt_uforget, "uid=forget"}, | 294 | {Opt_uforget, "uid=forget"}, |
| 291 | {Opt_uignore, "uid=ignore"}, | 295 | {Opt_uignore, "uid=ignore"}, |
| 292 | {Opt_gforget, "gid=forget"}, | 296 | {Opt_gforget, "gid=forget"}, |
| 293 | {Opt_gignore, "gid=ignore"}, | 297 | {Opt_gignore, "gid=ignore"}, |
| 294 | {Opt_gid, "gid=%u"}, | 298 | {Opt_gid, "gid=%u"}, |
| 295 | {Opt_uid, "uid=%u"}, | 299 | {Opt_uid, "uid=%u"}, |
| 296 | {Opt_umask, "umask=%o"}, | 300 | {Opt_umask, "umask=%o"}, |
| 297 | {Opt_session, "session=%u"}, | 301 | {Opt_session, "session=%u"}, |
| 298 | {Opt_lastblock, "lastblock=%u"}, | 302 | {Opt_lastblock, "lastblock=%u"}, |
| 299 | {Opt_anchor, "anchor=%u"}, | 303 | {Opt_anchor, "anchor=%u"}, |
| 300 | {Opt_volume, "volume=%u"}, | 304 | {Opt_volume, "volume=%u"}, |
| 301 | {Opt_partition, "partition=%u"}, | 305 | {Opt_partition, "partition=%u"}, |
| 302 | {Opt_fileset, "fileset=%u"}, | 306 | {Opt_fileset, "fileset=%u"}, |
| 303 | {Opt_rootdir, "rootdir=%u"}, | 307 | {Opt_rootdir, "rootdir=%u"}, |
| 304 | {Opt_utf8, "utf8"}, | 308 | {Opt_utf8, "utf8"}, |
| 305 | {Opt_iocharset, "iocharset=%s"}, | 309 | {Opt_iocharset, "iocharset=%s"}, |
| 306 | {Opt_err, NULL} | 310 | {Opt_err, NULL} |
| 307 | }; | 311 | }; |
| 308 | 312 | ||
| 309 | static int udf_parse_options(char *options, struct udf_options *uopt) | 313 | static int udf_parse_options(char *options, struct udf_options *uopt) |
| @@ -444,9 +448,11 @@ static int udf_parse_options(char *options, struct udf_options *uopt) | |||
| 444 | void udf_write_super(struct super_block *sb) | 448 | void udf_write_super(struct super_block *sb) |
| 445 | { | 449 | { |
| 446 | lock_kernel(); | 450 | lock_kernel(); |
| 451 | |||
| 447 | if (!(sb->s_flags & MS_RDONLY)) | 452 | if (!(sb->s_flags & MS_RDONLY)) |
| 448 | udf_open_lvid(sb); | 453 | udf_open_lvid(sb); |
| 449 | sb->s_dirt = 0; | 454 | sb->s_dirt = 0; |
| 455 | |||
| 450 | unlock_kernel(); | 456 | unlock_kernel(); |
| 451 | } | 457 | } |
| 452 | 458 | ||
| @@ -455,16 +461,16 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
| 455 | struct udf_options uopt; | 461 | struct udf_options uopt; |
| 456 | 462 | ||
| 457 | uopt.flags = UDF_SB(sb)->s_flags; | 463 | uopt.flags = UDF_SB(sb)->s_flags; |
| 458 | uopt.uid = UDF_SB(sb)->s_uid; | 464 | uopt.uid = UDF_SB(sb)->s_uid; |
| 459 | uopt.gid = UDF_SB(sb)->s_gid; | 465 | uopt.gid = UDF_SB(sb)->s_gid; |
| 460 | uopt.umask = UDF_SB(sb)->s_umask; | 466 | uopt.umask = UDF_SB(sb)->s_umask; |
| 461 | 467 | ||
| 462 | if (!udf_parse_options(options, &uopt)) | 468 | if (!udf_parse_options(options, &uopt)) |
| 463 | return -EINVAL; | 469 | return -EINVAL; |
| 464 | 470 | ||
| 465 | UDF_SB(sb)->s_flags = uopt.flags; | 471 | UDF_SB(sb)->s_flags = uopt.flags; |
| 466 | UDF_SB(sb)->s_uid = uopt.uid; | 472 | UDF_SB(sb)->s_uid = uopt.uid; |
| 467 | UDF_SB(sb)->s_gid = uopt.gid; | 473 | UDF_SB(sb)->s_gid = uopt.gid; |
| 468 | UDF_SB(sb)->s_umask = uopt.umask; | 474 | UDF_SB(sb)->s_umask = uopt.umask; |
| 469 | 475 | ||
| 470 | if (UDF_SB_LVIDBH(sb)) { | 476 | if (UDF_SB_LVIDBH(sb)) { |
| @@ -517,6 +523,7 @@ static int udf_set_blocksize(struct super_block *sb, int bsize) | |||
| 517 | printk(KERN_ERR "udf: bad block size (%d)\n", bsize); | 523 | printk(KERN_ERR "udf: bad block size (%d)\n", bsize); |
| 518 | return 0; | 524 | return 0; |
| 519 | } | 525 | } |
| 526 | |||
| 520 | return sb->s_blocksize; | 527 | return sb->s_blocksize; |
| 521 | } | 528 | } |
| 522 | 529 | ||
| @@ -552,15 +559,12 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
| 552 | 559 | ||
| 553 | /* Look for ISO descriptors */ | 560 | /* Look for ISO descriptors */ |
| 554 | vsd = (struct volStructDesc *)(bh->b_data + | 561 | vsd = (struct volStructDesc *)(bh->b_data + |
| 555 | (sector & | 562 | (sector & (sb->s_blocksize - 1))); |
| 556 | (sb->s_blocksize - 1))); | ||
| 557 | 563 | ||
| 558 | if (vsd->stdIdent[0] == 0) { | 564 | if (vsd->stdIdent[0] == 0) { |
| 559 | brelse(bh); | 565 | brelse(bh); |
| 560 | break; | 566 | break; |
| 561 | } else | 567 | } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, VSD_STD_ID_LEN)) { |
| 562 | if (!strncmp | ||
| 563 | (vsd->stdIdent, VSD_STD_ID_CD001, VSD_STD_ID_LEN)) { | ||
| 564 | iso9660 = sector; | 568 | iso9660 = sector; |
| 565 | switch (vsd->structType) { | 569 | switch (vsd->structType) { |
| 566 | case 0: | 570 | case 0: |
| @@ -587,21 +591,13 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
| 587 | vsd->structType); | 591 | vsd->structType); |
| 588 | break; | 592 | break; |
| 589 | } | 593 | } |
| 590 | } else | 594 | } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BEA01, VSD_STD_ID_LEN)) { |
| 591 | if (!strncmp | 595 | } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01, VSD_STD_ID_LEN)) { |
| 592 | (vsd->stdIdent, VSD_STD_ID_BEA01, VSD_STD_ID_LEN)) { | ||
| 593 | } else | ||
| 594 | if (!strncmp | ||
| 595 | (vsd->stdIdent, VSD_STD_ID_TEA01, VSD_STD_ID_LEN)) { | ||
| 596 | brelse(bh); | 596 | brelse(bh); |
| 597 | break; | 597 | break; |
| 598 | } else | 598 | } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02, VSD_STD_ID_LEN)) { |
| 599 | if (!strncmp | ||
| 600 | (vsd->stdIdent, VSD_STD_ID_NSR02, VSD_STD_ID_LEN)) { | ||
| 601 | nsr02 = sector; | 599 | nsr02 = sector; |
| 602 | } else | 600 | } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR03, VSD_STD_ID_LEN)) { |
| 603 | if (!strncmp | ||
| 604 | (vsd->stdIdent, VSD_STD_ID_NSR03, VSD_STD_ID_LEN)) { | ||
| 605 | nsr03 = sector; | 601 | nsr03 = sector; |
| 606 | } | 602 | } |
| 607 | brelse(bh); | 603 | brelse(bh); |
| @@ -644,11 +640,10 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 644 | 640 | ||
| 645 | if (lastblock) { | 641 | if (lastblock) { |
| 646 | int varlastblock = udf_variable_to_fixed(lastblock); | 642 | int varlastblock = udf_variable_to_fixed(lastblock); |
| 647 | int last[] = { lastblock, lastblock - 2, | 643 | int last[] = { lastblock, lastblock - 2, |
| 648 | lastblock - 150, lastblock - 152, | 644 | lastblock - 150, lastblock - 152, |
| 649 | varlastblock, varlastblock - 2, | 645 | varlastblock, varlastblock - 2, |
| 650 | varlastblock - 150, varlastblock - 152 | 646 | varlastblock - 150, varlastblock - 152 }; |
| 651 | }; | ||
| 652 | 647 | ||
| 653 | lastblock = 0; | 648 | lastblock = 0; |
| 654 | 649 | ||
| @@ -664,88 +659,54 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 664 | if (last[i] < 0 || !(bh = sb_bread(sb, last[i]))) { | 659 | if (last[i] < 0 || !(bh = sb_bread(sb, last[i]))) { |
| 665 | ident = location = 0; | 660 | ident = location = 0; |
| 666 | } else { | 661 | } else { |
| 667 | ident = | 662 | ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); |
| 668 | le16_to_cpu(((tag *) bh->b_data)->tagIdent); | 663 | location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); |
| 669 | location = | ||
| 670 | le32_to_cpu(((tag *) bh->b_data)-> | ||
| 671 | tagLocation); | ||
| 672 | brelse(bh); | 664 | brelse(bh); |
| 673 | } | 665 | } |
| 674 | 666 | ||
| 675 | if (ident == TAG_IDENT_AVDP) { | 667 | if (ident == TAG_IDENT_AVDP) { |
| 676 | if (location == last[i] - UDF_SB_SESSION(sb)) { | 668 | if (location == last[i] - UDF_SB_SESSION(sb)) { |
| 677 | lastblock = UDF_SB_ANCHOR(sb)[0] = | 669 | lastblock = UDF_SB_ANCHOR(sb)[0] = last[i] - UDF_SB_SESSION(sb); |
| 678 | last[i] - UDF_SB_SESSION(sb); | 670 | UDF_SB_ANCHOR(sb)[1] = last[i] - 256 - UDF_SB_SESSION(sb); |
| 679 | UDF_SB_ANCHOR(sb)[1] = | 671 | } else if (location == udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb)) { |
| 680 | last[i] - 256 - UDF_SB_SESSION(sb); | ||
| 681 | } else if (location == | ||
| 682 | udf_variable_to_fixed(last[i]) - | ||
| 683 | UDF_SB_SESSION(sb)) { | ||
| 684 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | 672 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); |
| 685 | lastblock = UDF_SB_ANCHOR(sb)[0] = | 673 | lastblock = UDF_SB_ANCHOR(sb)[0] = udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb); |
| 686 | udf_variable_to_fixed(last[i]) - | 674 | UDF_SB_ANCHOR(sb)[1] = lastblock - 256 - UDF_SB_SESSION(sb); |
| 687 | UDF_SB_SESSION(sb); | 675 | } else { |
| 688 | UDF_SB_ANCHOR(sb)[1] = | 676 | udf_debug("Anchor found at block %d, location mismatch %d.\n", |
| 689 | lastblock - 256 - | 677 | last[i], location); |
| 690 | UDF_SB_SESSION(sb); | 678 | } |
| 691 | } else | 679 | } else if (ident == TAG_IDENT_FE || ident == TAG_IDENT_EFE) { |
| 692 | udf_debug | ||
| 693 | ("Anchor found at block %d, location mismatch %d.\n", | ||
| 694 | last[i], location); | ||
| 695 | } else if (ident == TAG_IDENT_FE | ||
| 696 | || ident == TAG_IDENT_EFE) { | ||
| 697 | lastblock = last[i]; | 680 | lastblock = last[i]; |
| 698 | UDF_SB_ANCHOR(sb)[3] = 512; | 681 | UDF_SB_ANCHOR(sb)[3] = 512; |
| 699 | } else { | 682 | } else { |
| 700 | if (last[i] < 256 | 683 | if (last[i] < 256 || !(bh = sb_bread(sb, last[i] - 256))) { |
| 701 | || !(bh = sb_bread(sb, last[i] - 256))) { | ||
| 702 | ident = location = 0; | 684 | ident = location = 0; |
| 703 | } else { | 685 | } else { |
| 704 | ident = | 686 | ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); |
| 705 | le16_to_cpu(((tag *) bh->b_data)-> | 687 | location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); |
| 706 | tagIdent); | ||
| 707 | location = | ||
| 708 | le32_to_cpu(((tag *) bh->b_data)-> | ||
| 709 | tagLocation); | ||
| 710 | brelse(bh); | 688 | brelse(bh); |
| 711 | } | 689 | } |
| 712 | 690 | ||
| 713 | if (ident == TAG_IDENT_AVDP && | 691 | if (ident == TAG_IDENT_AVDP && |
| 714 | location == | 692 | location == last[i] - 256 - UDF_SB_SESSION(sb)) { |
| 715 | last[i] - 256 - UDF_SB_SESSION(sb)) { | ||
| 716 | lastblock = last[i]; | 693 | lastblock = last[i]; |
| 717 | UDF_SB_ANCHOR(sb)[1] = last[i] - 256; | 694 | UDF_SB_ANCHOR(sb)[1] = last[i] - 256; |
| 718 | } else { | 695 | } else { |
| 719 | if (last[i] < 312 + UDF_SB_SESSION(sb) | 696 | if (last[i] < 312 + UDF_SB_SESSION(sb) || |
| 720 | || !(bh = | 697 | !(bh = sb_bread(sb, last[i] - 312 - UDF_SB_SESSION(sb)))) { |
| 721 | sb_bread(sb, | ||
| 722 | last[i] - 312 - | ||
| 723 | UDF_SB_SESSION(sb)))) | ||
| 724 | { | ||
| 725 | ident = location = 0; | 698 | ident = location = 0; |
| 726 | } else { | 699 | } else { |
| 727 | ident = | 700 | ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); |
| 728 | le16_to_cpu(((tag *) bh-> | 701 | location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); |
| 729 | b_data)-> | ||
| 730 | tagIdent); | ||
| 731 | location = | ||
| 732 | le32_to_cpu(((tag *) bh-> | ||
| 733 | b_data)-> | ||
| 734 | tagLocation); | ||
| 735 | brelse(bh); | 702 | brelse(bh); |
| 736 | } | 703 | } |
| 737 | 704 | ||
| 738 | if (ident == TAG_IDENT_AVDP && | 705 | if (ident == TAG_IDENT_AVDP && |
| 739 | location == | 706 | location == udf_variable_to_fixed(last[i]) - 256) { |
| 740 | udf_variable_to_fixed(last[i]) - | 707 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); |
| 741 | 256) { | 708 | lastblock = udf_variable_to_fixed(last[i]); |
| 742 | UDF_SET_FLAG(sb, | 709 | UDF_SB_ANCHOR(sb)[1] = lastblock - 256; |
| 743 | UDF_FLAG_VARCONV); | ||
| 744 | lastblock = | ||
| 745 | udf_variable_to_fixed(last | ||
| 746 | [i]); | ||
| 747 | UDF_SB_ANCHOR(sb)[1] = | ||
| 748 | lastblock - 256; | ||
| 749 | } | 710 | } |
| 750 | } | 711 | } |
| 751 | } | 712 | } |
| @@ -755,9 +716,8 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 755 | if (!lastblock) { | 716 | if (!lastblock) { |
| 756 | /* We havn't found the lastblock. check 312 */ | 717 | /* We havn't found the lastblock. check 312 */ |
| 757 | if ((bh = sb_bread(sb, 312 + UDF_SB_SESSION(sb)))) { | 718 | if ((bh = sb_bread(sb, 312 + UDF_SB_SESSION(sb)))) { |
| 758 | ident = le16_to_cpu(((tag *) bh->b_data)->tagIdent); | 719 | ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent); |
| 759 | location = | 720 | location = le32_to_cpu(((tag *)bh->b_data)->tagLocation); |
| 760 | le32_to_cpu(((tag *) bh->b_data)->tagLocation); | ||
| 761 | brelse(bh); | 721 | brelse(bh); |
| 762 | 722 | ||
| 763 | if (ident == TAG_IDENT_AVDP && location == 256) | 723 | if (ident == TAG_IDENT_AVDP && location == 256) |
| @@ -767,19 +727,13 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 767 | 727 | ||
| 768 | for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) { | 728 | for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) { |
| 769 | if (UDF_SB_ANCHOR(sb)[i]) { | 729 | if (UDF_SB_ANCHOR(sb)[i]) { |
| 770 | if (!(bh = udf_read_tagged(sb, | 730 | if (!(bh = udf_read_tagged(sb, UDF_SB_ANCHOR(sb)[i], |
| 771 | UDF_SB_ANCHOR(sb)[i], | 731 | UDF_SB_ANCHOR(sb)[i], &ident))) { |
| 772 | UDF_SB_ANCHOR(sb)[i], | ||
| 773 | &ident))) { | ||
| 774 | UDF_SB_ANCHOR(sb)[i] = 0; | 732 | UDF_SB_ANCHOR(sb)[i] = 0; |
| 775 | } else { | 733 | } else { |
| 776 | brelse(bh); | 734 | brelse(bh); |
| 777 | if ((ident != TAG_IDENT_AVDP) && (i || | 735 | if ((ident != TAG_IDENT_AVDP) && |
| 778 | (ident != | 736 | (i || (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE))) { |
| 779 | TAG_IDENT_FE | ||
| 780 | && ident != | ||
| 781 | TAG_IDENT_EFE))) | ||
| 782 | { | ||
| 783 | UDF_SB_ANCHOR(sb)[i] = 0; | 737 | UDF_SB_ANCHOR(sb)[i] = 0; |
| 784 | } | 738 | } |
| 785 | } | 739 | } |
| @@ -789,9 +743,7 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 789 | UDF_SB_LASTBLOCK(sb) = lastblock; | 743 | UDF_SB_LASTBLOCK(sb) = lastblock; |
| 790 | } | 744 | } |
| 791 | 745 | ||
| 792 | static int | 746 | static int udf_find_fileset(struct super_block *sb, kernel_lb_addr *fileset, kernel_lb_addr *root) |
| 793 | udf_find_fileset(struct super_block *sb, kernel_lb_addr * fileset, | ||
| 794 | kernel_lb_addr * root) | ||
| 795 | { | 747 | { |
| 796 | struct buffer_head *bh = NULL; | 748 | struct buffer_head *bh = NULL; |
| 797 | long lastblock; | 749 | long lastblock; |
| @@ -801,18 +753,19 @@ udf_find_fileset(struct super_block *sb, kernel_lb_addr * fileset, | |||
| 801 | fileset->partitionReferenceNum != 0xFFFF) { | 753 | fileset->partitionReferenceNum != 0xFFFF) { |
| 802 | bh = udf_read_ptagged(sb, *fileset, 0, &ident); | 754 | bh = udf_read_ptagged(sb, *fileset, 0, &ident); |
| 803 | 755 | ||
| 804 | if (!bh) | 756 | if (!bh) { |
| 805 | return 1; | 757 | return 1; |
| 806 | else if (ident != TAG_IDENT_FSD) { | 758 | } else if (ident != TAG_IDENT_FSD) { |
| 807 | brelse(bh); | 759 | brelse(bh); |
| 808 | return 1; | 760 | return 1; |
| 809 | } | 761 | } |
| 810 | 762 | ||
| 811 | } | 763 | } |
| 812 | 764 | ||
| 813 | if (!bh) { /* Search backwards through the partitions */ | 765 | if (!bh) { /* Search backwards through the partitions */ |
| 814 | kernel_lb_addr newfileset; | 766 | kernel_lb_addr newfileset; |
| 815 | 767 | ||
| 768 | /* --> cvg: FIXME - is it reasonable? */ | ||
| 816 | return 1; | 769 | return 1; |
| 817 | 770 | ||
| 818 | for (newfileset.partitionReferenceNum = UDF_SB_NUMPARTS(sb) - 1; | 771 | for (newfileset.partitionReferenceNum = UDF_SB_NUMPARTS(sb) - 1; |
| @@ -820,14 +773,11 @@ udf_find_fileset(struct super_block *sb, kernel_lb_addr * fileset, | |||
| 820 | fileset->logicalBlockNum == 0xFFFFFFFF && | 773 | fileset->logicalBlockNum == 0xFFFFFFFF && |
| 821 | fileset->partitionReferenceNum == 0xFFFF); | 774 | fileset->partitionReferenceNum == 0xFFFF); |
| 822 | newfileset.partitionReferenceNum--) { | 775 | newfileset.partitionReferenceNum--) { |
| 823 | lastblock = | 776 | lastblock = UDF_SB_PARTLEN(sb, newfileset.partitionReferenceNum); |
| 824 | UDF_SB_PARTLEN(sb, | ||
| 825 | newfileset.partitionReferenceNum); | ||
| 826 | newfileset.logicalBlockNum = 0; | 777 | newfileset.logicalBlockNum = 0; |
| 827 | 778 | ||
| 828 | do { | 779 | do { |
| 829 | bh = udf_read_ptagged(sb, newfileset, 0, | 780 | bh = udf_read_ptagged(sb, newfileset, 0, &ident); |
| 830 | &ident); | ||
| 831 | if (!bh) { | 781 | if (!bh) { |
| 832 | newfileset.logicalBlockNum++; | 782 | newfileset.logicalBlockNum++; |
| 833 | continue; | 783 | continue; |
| @@ -835,38 +785,28 @@ udf_find_fileset(struct super_block *sb, kernel_lb_addr * fileset, | |||
| 835 | 785 | ||
| 836 | switch (ident) { | 786 | switch (ident) { |
| 837 | case TAG_IDENT_SBD: | 787 | case TAG_IDENT_SBD: |
| 838 | { | 788 | { |
| 839 | struct spaceBitmapDesc *sp; | 789 | struct spaceBitmapDesc *sp; |
| 840 | sp = (struct spaceBitmapDesc *) | 790 | sp = (struct spaceBitmapDesc *)bh->b_data; |
| 841 | bh->b_data; | 791 | newfileset.logicalBlockNum += 1 + |
| 842 | newfileset.logicalBlockNum += | 792 | ((le32_to_cpu(sp->numOfBytes) + |
| 843 | 1 + | 793 | sizeof(struct spaceBitmapDesc) - 1) |
| 844 | ((le32_to_cpu | 794 | >> sb->s_blocksize_bits); |
| 845 | (sp->numOfBytes) + | 795 | brelse(bh); |
| 846 | sizeof(struct | 796 | break; |
| 847 | spaceBitmapDesc) - | 797 | } |
| 848 | 1) | ||
| 849 | >> sb->s_blocksize_bits); | ||
| 850 | brelse(bh); | ||
| 851 | break; | ||
| 852 | } | ||
| 853 | case TAG_IDENT_FSD: | 798 | case TAG_IDENT_FSD: |
| 854 | { | 799 | *fileset = newfileset; |
| 855 | *fileset = newfileset; | 800 | break; |
| 856 | break; | ||
| 857 | } | ||
| 858 | default: | 801 | default: |
| 859 | { | 802 | newfileset.logicalBlockNum++; |
| 860 | newfileset.logicalBlockNum++; | 803 | brelse(bh); |
| 861 | brelse(bh); | 804 | bh = NULL; |
| 862 | bh = NULL; | 805 | break; |
| 863 | break; | ||
| 864 | } | ||
| 865 | } | 806 | } |
| 866 | } | 807 | } while (newfileset.logicalBlockNum < lastblock && |
| 867 | while (newfileset.logicalBlockNum < lastblock && | 808 | fileset->logicalBlockNum == 0xFFFFFFFF && |
| 868 | fileset->logicalBlockNum == 0xFFFFFFFF && | 809 | fileset->partitionReferenceNum == 0xFFFF); |
| 869 | fileset->partitionReferenceNum == 0xFFFF); | ||
| 870 | } | 810 | } |
| 871 | } | 811 | } |
| 872 | 812 | ||
| @@ -898,10 +838,10 @@ static void udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh) | |||
| 898 | lets_to_cpu(pvoldesc->recordingDateAndTime))) { | 838 | lets_to_cpu(pvoldesc->recordingDateAndTime))) { |
| 899 | kernel_timestamp ts; | 839 | kernel_timestamp ts; |
| 900 | ts = lets_to_cpu(pvoldesc->recordingDateAndTime); | 840 | ts = lets_to_cpu(pvoldesc->recordingDateAndTime); |
| 901 | udf_debug | 841 | udf_debug("recording time %ld/%ld, %04u/%02u/%02u %02u:%02u (%x)\n", |
| 902 | ("recording time %ld/%ld, %04u/%02u/%02u %02u:%02u (%x)\n", | 842 | recording, recording_usec, |
| 903 | recording, recording_usec, ts.year, ts.month, ts.day, | 843 | ts.year, ts.month, ts.day, ts.hour, |
| 904 | ts.hour, ts.minute, ts.typeAndTimezone); | 844 | ts.minute, ts.typeAndTimezone); |
| 905 | UDF_SB_RECORDTIME(sb).tv_sec = recording; | 845 | UDF_SB_RECORDTIME(sb).tv_sec = recording; |
| 906 | UDF_SB_RECORDTIME(sb).tv_nsec = recording_usec * 1000; | 846 | UDF_SB_RECORDTIME(sb).tv_nsec = recording_usec * 1000; |
| 907 | } | 847 | } |
| @@ -920,9 +860,8 @@ static void udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh) | |||
| 920 | } | 860 | } |
| 921 | } | 861 | } |
| 922 | 862 | ||
| 923 | static void | 863 | static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh, |
| 924 | udf_load_fileset(struct super_block *sb, struct buffer_head *bh, | 864 | kernel_lb_addr *root) |
| 925 | kernel_lb_addr * root) | ||
| 926 | { | 865 | { |
| 927 | struct fileSetDesc *fset; | 866 | struct fileSetDesc *fset; |
| 928 | 867 | ||
| @@ -945,121 +884,72 @@ static void udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) | |||
| 945 | 884 | ||
| 946 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { | 885 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { |
| 947 | udf_debug("Searching map: (%d == %d)\n", | 886 | udf_debug("Searching map: (%d == %d)\n", |
| 948 | UDF_SB_PARTMAPS(sb)[i].s_partition_num, | 887 | UDF_SB_PARTMAPS(sb)[i].s_partition_num, le16_to_cpu(p->partitionNumber)); |
| 949 | le16_to_cpu(p->partitionNumber)); | 888 | if (UDF_SB_PARTMAPS(sb)[i].s_partition_num == le16_to_cpu(p->partitionNumber)) { |
| 950 | if (UDF_SB_PARTMAPS(sb)[i].s_partition_num == | 889 | UDF_SB_PARTLEN(sb,i) = le32_to_cpu(p->partitionLength); /* blocks */ |
| 951 | le16_to_cpu(p->partitionNumber)) { | 890 | UDF_SB_PARTROOT(sb,i) = le32_to_cpu(p->partitionStartingLocation); |
| 952 | UDF_SB_PARTLEN(sb, i) = le32_to_cpu(p->partitionLength); /* blocks */ | 891 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_READ_ONLY) |
| 953 | UDF_SB_PARTROOT(sb, i) = | 892 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_READ_ONLY; |
| 954 | le32_to_cpu(p->partitionStartingLocation); | 893 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_WRITE_ONCE) |
| 955 | if (le32_to_cpu(p->accessType) == | 894 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_WRITE_ONCE; |
| 956 | PD_ACCESS_TYPE_READ_ONLY) | 895 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_REWRITABLE) |
| 957 | UDF_SB_PARTFLAGS(sb, i) |= | 896 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_REWRITABLE; |
| 958 | UDF_PART_FLAG_READ_ONLY; | 897 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_OVERWRITABLE) |
| 959 | if (le32_to_cpu(p->accessType) == | 898 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_OVERWRITABLE; |
| 960 | PD_ACCESS_TYPE_WRITE_ONCE) | 899 | |
| 961 | UDF_SB_PARTFLAGS(sb, i) |= | 900 | if (!strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) || |
| 962 | UDF_PART_FLAG_WRITE_ONCE; | 901 | !strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03)) { |
| 963 | if (le32_to_cpu(p->accessType) == | ||
| 964 | PD_ACCESS_TYPE_REWRITABLE) | ||
| 965 | UDF_SB_PARTFLAGS(sb, i) |= | ||
| 966 | UDF_PART_FLAG_REWRITABLE; | ||
| 967 | if (le32_to_cpu(p->accessType) == | ||
| 968 | PD_ACCESS_TYPE_OVERWRITABLE) | ||
| 969 | UDF_SB_PARTFLAGS(sb, i) |= | ||
| 970 | UDF_PART_FLAG_OVERWRITABLE; | ||
| 971 | |||
| 972 | if (!strcmp | ||
| 973 | (p->partitionContents.ident, | ||
| 974 | PD_PARTITION_CONTENTS_NSR02) | ||
| 975 | || !strcmp(p->partitionContents.ident, | ||
| 976 | PD_PARTITION_CONTENTS_NSR03)) { | ||
| 977 | struct partitionHeaderDesc *phd; | 902 | struct partitionHeaderDesc *phd; |
| 978 | 903 | ||
| 979 | phd = | 904 | phd = (struct partitionHeaderDesc *)(p->partitionContentsUse); |
| 980 | (struct partitionHeaderDesc *)(p-> | ||
| 981 | partitionContentsUse); | ||
| 982 | if (phd->unallocSpaceTable.extLength) { | 905 | if (phd->unallocSpaceTable.extLength) { |
| 983 | kernel_lb_addr loc = | 906 | kernel_lb_addr loc = { |
| 984 | { le32_to_cpu(phd-> | 907 | .logicalBlockNum = le32_to_cpu(phd->unallocSpaceTable.extPosition), |
| 985 | unallocSpaceTable. | 908 | .partitionReferenceNum = i, |
| 986 | extPosition), i }; | 909 | }; |
| 987 | 910 | ||
| 988 | UDF_SB_PARTMAPS(sb)[i].s_uspace. | 911 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table = |
| 989 | s_table = udf_iget(sb, loc); | 912 | udf_iget(sb, loc); |
| 990 | UDF_SB_PARTFLAGS(sb, i) |= | 913 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_TABLE; |
| 991 | UDF_PART_FLAG_UNALLOC_TABLE; | 914 | udf_debug("unallocSpaceTable (part %d) @ %ld\n", |
| 992 | udf_debug | 915 | i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table->i_ino); |
| 993 | ("unallocSpaceTable (part %d) @ %ld\n", | ||
| 994 | i, | ||
| 995 | UDF_SB_PARTMAPS(sb)[i].s_uspace. | ||
| 996 | s_table->i_ino); | ||
| 997 | } | 916 | } |
| 998 | if (phd->unallocSpaceBitmap.extLength) { | 917 | if (phd->unallocSpaceBitmap.extLength) { |
| 999 | UDF_SB_ALLOC_BITMAP(sb, i, s_uspace); | 918 | UDF_SB_ALLOC_BITMAP(sb, i, s_uspace); |
| 1000 | if (UDF_SB_PARTMAPS(sb)[i].s_uspace. | 919 | if (UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap != NULL) { |
| 1001 | s_bitmap != NULL) { | 920 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extLength = |
| 1002 | UDF_SB_PARTMAPS(sb)[i].s_uspace. | 921 | le32_to_cpu(phd->unallocSpaceBitmap.extLength); |
| 1003 | s_bitmap->s_extLength = | 922 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition = |
| 1004 | le32_to_cpu(phd-> | 923 | le32_to_cpu(phd->unallocSpaceBitmap.extPosition); |
| 1005 | unallocSpaceBitmap. | 924 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_BITMAP; |
| 1006 | extLength); | 925 | udf_debug("unallocSpaceBitmap (part %d) @ %d\n", |
| 1007 | UDF_SB_PARTMAPS(sb)[i].s_uspace. | 926 | i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition); |
| 1008 | s_bitmap->s_extPosition = | ||
| 1009 | le32_to_cpu(phd-> | ||
| 1010 | unallocSpaceBitmap. | ||
| 1011 | extPosition); | ||
| 1012 | UDF_SB_PARTFLAGS(sb, i) |= | ||
| 1013 | UDF_PART_FLAG_UNALLOC_BITMAP; | ||
| 1014 | udf_debug | ||
| 1015 | ("unallocSpaceBitmap (part %d) @ %d\n", | ||
| 1016 | i, | ||
| 1017 | UDF_SB_PARTMAPS(sb)[i]. | ||
| 1018 | s_uspace.s_bitmap-> | ||
| 1019 | s_extPosition); | ||
| 1020 | } | 927 | } |
| 1021 | } | 928 | } |
| 1022 | if (phd->partitionIntegrityTable.extLength) | 929 | if (phd->partitionIntegrityTable.extLength) |
| 1023 | udf_debug | 930 | udf_debug("partitionIntegrityTable (part %d)\n", i); |
| 1024 | ("partitionIntegrityTable (part %d)\n", | ||
| 1025 | i); | ||
| 1026 | if (phd->freedSpaceTable.extLength) { | 931 | if (phd->freedSpaceTable.extLength) { |
| 1027 | kernel_lb_addr loc = | 932 | kernel_lb_addr loc = { |
| 1028 | { le32_to_cpu(phd->freedSpaceTable. | 933 | .logicalBlockNum = le32_to_cpu(phd->freedSpaceTable.extPosition), |
| 1029 | extPosition), i }; | 934 | .partitionReferenceNum = i, |
| 1030 | 935 | }; | |
| 1031 | UDF_SB_PARTMAPS(sb)[i].s_fspace. | 936 | |
| 1032 | s_table = udf_iget(sb, loc); | 937 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table = |
| 1033 | UDF_SB_PARTFLAGS(sb, i) |= | 938 | udf_iget(sb, loc); |
| 1034 | UDF_PART_FLAG_FREED_TABLE; | 939 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_TABLE; |
| 1035 | udf_debug | 940 | udf_debug("freedSpaceTable (part %d) @ %ld\n", |
| 1036 | ("freedSpaceTable (part %d) @ %ld\n", | 941 | i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table->i_ino); |
| 1037 | i, | ||
| 1038 | UDF_SB_PARTMAPS(sb)[i].s_fspace. | ||
| 1039 | s_table->i_ino); | ||
| 1040 | } | 942 | } |
| 1041 | if (phd->freedSpaceBitmap.extLength) { | 943 | if (phd->freedSpaceBitmap.extLength) { |
| 1042 | UDF_SB_ALLOC_BITMAP(sb, i, s_fspace); | 944 | UDF_SB_ALLOC_BITMAP(sb, i, s_fspace); |
| 1043 | if (UDF_SB_PARTMAPS(sb)[i].s_fspace. | 945 | if (UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap != NULL) { |
| 1044 | s_bitmap != NULL) { | 946 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extLength = |
| 1045 | UDF_SB_PARTMAPS(sb)[i].s_fspace. | 947 | le32_to_cpu(phd->freedSpaceBitmap.extLength); |
| 1046 | s_bitmap->s_extLength = | 948 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition = |
| 1047 | le32_to_cpu(phd-> | 949 | le32_to_cpu(phd->freedSpaceBitmap.extPosition); |
| 1048 | freedSpaceBitmap. | 950 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_BITMAP; |
| 1049 | extLength); | 951 | udf_debug("freedSpaceBitmap (part %d) @ %d\n", |
| 1050 | UDF_SB_PARTMAPS(sb)[i].s_fspace. | 952 | i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition); |
| 1051 | s_bitmap->s_extPosition = | ||
| 1052 | le32_to_cpu(phd-> | ||
| 1053 | freedSpaceBitmap. | ||
| 1054 | extPosition); | ||
| 1055 | UDF_SB_PARTFLAGS(sb, i) |= | ||
| 1056 | UDF_PART_FLAG_FREED_BITMAP; | ||
| 1057 | udf_debug | ||
| 1058 | ("freedSpaceBitmap (part %d) @ %d\n", | ||
| 1059 | i, | ||
| 1060 | UDF_SB_PARTMAPS(sb)[i]. | ||
| 1061 | s_fspace.s_bitmap-> | ||
| 1062 | s_extPosition); | ||
| 1063 | } | 953 | } |
| 1064 | } | 954 | } |
| 1065 | } | 955 | } |
| @@ -1070,16 +960,14 @@ static void udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) | |||
| 1070 | udf_debug("Partition (%d) not found in partition map\n", | 960 | udf_debug("Partition (%d) not found in partition map\n", |
| 1071 | le16_to_cpu(p->partitionNumber)); | 961 | le16_to_cpu(p->partitionNumber)); |
| 1072 | } else { | 962 | } else { |
| 1073 | udf_debug | 963 | udf_debug("Partition (%d:%d type %x) starts at physical %d, block length %d\n", |
| 1074 | ("Partition (%d:%d type %x) starts at physical %d, block length %d\n", | 964 | le16_to_cpu(p->partitionNumber), i, UDF_SB_PARTTYPE(sb,i), |
| 1075 | le16_to_cpu(p->partitionNumber), i, UDF_SB_PARTTYPE(sb, i), | 965 | UDF_SB_PARTROOT(sb,i), UDF_SB_PARTLEN(sb,i)); |
| 1076 | UDF_SB_PARTROOT(sb, i), UDF_SB_PARTLEN(sb, i)); | ||
| 1077 | } | 966 | } |
| 1078 | } | 967 | } |
| 1079 | 968 | ||
| 1080 | static int | 969 | static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh, |
| 1081 | udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh, | 970 | kernel_lb_addr *fileset) |
| 1082 | kernel_lb_addr * fileset) | ||
| 1083 | { | 971 | { |
| 1084 | struct logicalVolDesc *lvd; | 972 | struct logicalVolDesc *lvd; |
| 1085 | int i, j, offset; | 973 | int i, j, offset; |
| @@ -1090,116 +978,69 @@ udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh, | |||
| 1090 | UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps)); | 978 | UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps)); |
| 1091 | 979 | ||
| 1092 | for (i = 0, offset = 0; | 980 | for (i = 0, offset = 0; |
| 1093 | i < UDF_SB_NUMPARTS(sb) | 981 | i < UDF_SB_NUMPARTS(sb) && offset < le32_to_cpu(lvd->mapTableLength); |
| 1094 | && offset < le32_to_cpu(lvd->mapTableLength); | 982 | i++, offset += ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapLength) { |
| 1095 | i++, offset += | 983 | type = ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapType; |
| 1096 | ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))-> | ||
| 1097 | partitionMapLength) { | ||
| 1098 | type = | ||
| 1099 | ((struct genericPartitionMap *) | ||
| 1100 | &(lvd->partitionMaps[offset]))->partitionMapType; | ||
| 1101 | if (type == 1) { | 984 | if (type == 1) { |
| 1102 | struct genericPartitionMap1 *gpm1 = | 985 | struct genericPartitionMap1 *gpm1 = (struct genericPartitionMap1 *)&(lvd->partitionMaps[offset]); |
| 1103 | (struct genericPartitionMap1 *)&(lvd-> | 986 | UDF_SB_PARTTYPE(sb,i) = UDF_TYPE1_MAP15; |
| 1104 | partitionMaps | 987 | UDF_SB_PARTVSN(sb,i) = le16_to_cpu(gpm1->volSeqNum); |
| 1105 | [offset]); | 988 | UDF_SB_PARTNUM(sb,i) = le16_to_cpu(gpm1->partitionNum); |
| 1106 | UDF_SB_PARTTYPE(sb, i) = UDF_TYPE1_MAP15; | 989 | UDF_SB_PARTFUNC(sb,i) = NULL; |
| 1107 | UDF_SB_PARTVSN(sb, i) = le16_to_cpu(gpm1->volSeqNum); | ||
| 1108 | UDF_SB_PARTNUM(sb, i) = le16_to_cpu(gpm1->partitionNum); | ||
| 1109 | UDF_SB_PARTFUNC(sb, i) = NULL; | ||
| 1110 | } else if (type == 2) { | 990 | } else if (type == 2) { |
| 1111 | struct udfPartitionMap2 *upm2 = | 991 | struct udfPartitionMap2 *upm2 = (struct udfPartitionMap2 *)&(lvd->partitionMaps[offset]); |
| 1112 | (struct udfPartitionMap2 *)&(lvd-> | 992 | if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL, strlen(UDF_ID_VIRTUAL))) { |
| 1113 | partitionMaps[offset]); | 993 | if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0150) { |
| 1114 | if (!strncmp | 994 | UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP15; |
| 1115 | (upm2->partIdent.ident, UDF_ID_VIRTUAL, | 995 | UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt15; |
| 1116 | strlen(UDF_ID_VIRTUAL))) { | 996 | } else if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0200) { |
| 1117 | if (le16_to_cpu | 997 | UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP20; |
| 1118 | (((__le16 *) upm2->partIdent. | 998 | UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt20; |
| 1119 | identSuffix)[0]) == 0x0150) { | ||
| 1120 | UDF_SB_PARTTYPE(sb, i) = | ||
| 1121 | UDF_VIRTUAL_MAP15; | ||
| 1122 | UDF_SB_PARTFUNC(sb, i) = | ||
| 1123 | udf_get_pblock_virt15; | ||
| 1124 | } else | ||
| 1125 | if (le16_to_cpu | ||
| 1126 | (((__le16 *) upm2->partIdent. | ||
| 1127 | identSuffix)[0]) == 0x0200) { | ||
| 1128 | UDF_SB_PARTTYPE(sb, i) = | ||
| 1129 | UDF_VIRTUAL_MAP20; | ||
| 1130 | UDF_SB_PARTFUNC(sb, i) = | ||
| 1131 | udf_get_pblock_virt20; | ||
| 1132 | } | 999 | } |
| 1133 | } else | 1000 | } else if (!strncmp(upm2->partIdent.ident, UDF_ID_SPARABLE, strlen(UDF_ID_SPARABLE))) { |
| 1134 | if (!strncmp | ||
| 1135 | (upm2->partIdent.ident, UDF_ID_SPARABLE, | ||
| 1136 | strlen(UDF_ID_SPARABLE))) { | ||
| 1137 | uint32_t loc; | 1001 | uint32_t loc; |
| 1138 | uint16_t ident; | 1002 | uint16_t ident; |
| 1139 | struct sparingTable *st; | 1003 | struct sparingTable *st; |
| 1140 | struct sparablePartitionMap *spm = | 1004 | struct sparablePartitionMap *spm = (struct sparablePartitionMap *)&(lvd->partitionMaps[offset]); |
| 1141 | (struct sparablePartitionMap *)&(lvd-> | 1005 | |
| 1142 | partitionMaps | 1006 | UDF_SB_PARTTYPE(sb,i) = UDF_SPARABLE_MAP15; |
| 1143 | [offset]); | 1007 | UDF_SB_TYPESPAR(sb,i).s_packet_len = le16_to_cpu(spm->packetLength); |
| 1144 | |||
| 1145 | UDF_SB_PARTTYPE(sb, i) = UDF_SPARABLE_MAP15; | ||
| 1146 | UDF_SB_TYPESPAR(sb, i).s_packet_len = | ||
| 1147 | le16_to_cpu(spm->packetLength); | ||
| 1148 | for (j = 0; j < spm->numSparingTables; j++) { | 1008 | for (j = 0; j < spm->numSparingTables; j++) { |
| 1149 | loc = | 1009 | loc = le32_to_cpu(spm->locSparingTable[j]); |
| 1150 | le32_to_cpu(spm-> | 1010 | UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = |
| 1151 | locSparingTable[j]); | 1011 | udf_read_tagged(sb, loc, loc, &ident); |
| 1152 | UDF_SB_TYPESPAR(sb, i).s_spar_map[j] = | 1012 | if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL) { |
| 1153 | udf_read_tagged(sb, loc, loc, | 1013 | st = (struct sparingTable *)UDF_SB_TYPESPAR(sb,i).s_spar_map[j]->b_data; |
| 1154 | &ident); | 1014 | if (ident != 0 || |
| 1155 | if (UDF_SB_TYPESPAR(sb, i). | 1015 | strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING))) { |
| 1156 | s_spar_map[j] != NULL) { | 1016 | brelse(UDF_SB_TYPESPAR(sb,i).s_spar_map[j]); |
| 1157 | st = (struct sparingTable *) | 1017 | UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = NULL; |
| 1158 | UDF_SB_TYPESPAR(sb, | ||
| 1159 | i). | ||
| 1160 | s_spar_map[j]->b_data; | ||
| 1161 | if (ident != 0 | ||
| 1162 | || strncmp(st->sparingIdent. | ||
| 1163 | ident, | ||
| 1164 | UDF_ID_SPARING, | ||
| 1165 | strlen | ||
| 1166 | (UDF_ID_SPARING))) | ||
| 1167 | { | ||
| 1168 | brelse(UDF_SB_TYPESPAR | ||
| 1169 | (sb, | ||
| 1170 | i). | ||
| 1171 | s_spar_map[j]); | ||
| 1172 | UDF_SB_TYPESPAR(sb, | ||
| 1173 | i). | ||
| 1174 | s_spar_map[j] = | ||
| 1175 | NULL; | ||
| 1176 | } | 1018 | } |
| 1177 | } | 1019 | } |
| 1178 | } | 1020 | } |
| 1179 | UDF_SB_PARTFUNC(sb, i) = udf_get_pblock_spar15; | 1021 | UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_spar15; |
| 1180 | } else { | 1022 | } else { |
| 1181 | udf_debug("Unknown ident: %s\n", | 1023 | udf_debug("Unknown ident: %s\n", upm2->partIdent.ident); |
| 1182 | upm2->partIdent.ident); | ||
| 1183 | continue; | 1024 | continue; |
| 1184 | } | 1025 | } |
| 1185 | UDF_SB_PARTVSN(sb, i) = le16_to_cpu(upm2->volSeqNum); | 1026 | UDF_SB_PARTVSN(sb,i) = le16_to_cpu(upm2->volSeqNum); |
| 1186 | UDF_SB_PARTNUM(sb, i) = le16_to_cpu(upm2->partitionNum); | 1027 | UDF_SB_PARTNUM(sb,i) = le16_to_cpu(upm2->partitionNum); |
| 1187 | } | 1028 | } |
| 1188 | udf_debug("Partition (%d:%d) type %d on volume %d\n", | 1029 | udf_debug("Partition (%d:%d) type %d on volume %d\n", |
| 1189 | i, UDF_SB_PARTNUM(sb, i), type, UDF_SB_PARTVSN(sb, | 1030 | i, UDF_SB_PARTNUM(sb,i), type, UDF_SB_PARTVSN(sb,i)); |
| 1190 | i)); | ||
| 1191 | } | 1031 | } |
| 1192 | 1032 | ||
| 1193 | if (fileset) { | 1033 | if (fileset) { |
| 1194 | long_ad *la = (long_ad *) & (lvd->logicalVolContentsUse[0]); | 1034 | long_ad *la = (long_ad *)&(lvd->logicalVolContentsUse[0]); |
| 1195 | 1035 | ||
| 1196 | *fileset = lelb_to_cpu(la->extLocation); | 1036 | *fileset = lelb_to_cpu(la->extLocation); |
| 1197 | udf_debug | 1037 | udf_debug("FileSet found in LogicalVolDesc at block=%d, partition=%d\n", |
| 1198 | ("FileSet found in LogicalVolDesc at block=%d, partition=%d\n", | 1038 | fileset->logicalBlockNum, |
| 1199 | fileset->logicalBlockNum, fileset->partitionReferenceNum); | 1039 | fileset->partitionReferenceNum); |
| 1200 | } | 1040 | } |
| 1201 | if (lvd->integritySeqExt.extLength) | 1041 | if (lvd->integritySeqExt.extLength) |
| 1202 | udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt)); | 1042 | udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt)); |
| 1043 | |||
| 1203 | return 0; | 1044 | return 0; |
| 1204 | } | 1045 | } |
| 1205 | 1046 | ||
| @@ -1219,9 +1060,7 @@ static void udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc) | |||
| 1219 | UDF_SB_LVIDBH(sb) = bh; | 1060 | UDF_SB_LVIDBH(sb) = bh; |
| 1220 | 1061 | ||
| 1221 | if (UDF_SB_LVID(sb)->nextIntegrityExt.extLength) | 1062 | if (UDF_SB_LVID(sb)->nextIntegrityExt.extLength) |
| 1222 | udf_load_logicalvolint(sb, | 1063 | udf_load_logicalvolint(sb, leea_to_cpu(UDF_SB_LVID(sb)->nextIntegrityExt)); |
| 1223 | leea_to_cpu(UDF_SB_LVID(sb)-> | ||
| 1224 | nextIntegrityExt)); | ||
| 1225 | 1064 | ||
| 1226 | if (UDF_SB_LVIDBH(sb) != bh) | 1065 | if (UDF_SB_LVIDBH(sb) != bh) |
| 1227 | brelse(bh); | 1066 | brelse(bh); |
| @@ -1247,9 +1086,8 @@ static void udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc) | |||
| 1247 | * July 1, 1997 - Andrew E. Mileski | 1086 | * July 1, 1997 - Andrew E. Mileski |
| 1248 | * Written, tested, and released. | 1087 | * Written, tested, and released. |
| 1249 | */ | 1088 | */ |
| 1250 | static int | 1089 | static int udf_process_sequence(struct super_block *sb, long block, long lastblock, |
| 1251 | udf_process_sequence(struct super_block *sb, long block, long lastblock, | 1090 | kernel_lb_addr *fileset) |
| 1252 | kernel_lb_addr * fileset) | ||
| 1253 | { | 1091 | { |
| 1254 | struct buffer_head *bh = NULL; | 1092 | struct buffer_head *bh = NULL; |
| 1255 | struct udf_vds_record vds[VDS_POS_LENGTH]; | 1093 | struct udf_vds_record vds[VDS_POS_LENGTH]; |
| @@ -1274,82 +1112,71 @@ udf_process_sequence(struct super_block *sb, long block, long lastblock, | |||
| 1274 | gd = (struct generic_desc *)bh->b_data; | 1112 | gd = (struct generic_desc *)bh->b_data; |
| 1275 | vdsn = le32_to_cpu(gd->volDescSeqNum); | 1113 | vdsn = le32_to_cpu(gd->volDescSeqNum); |
| 1276 | switch (ident) { | 1114 | switch (ident) { |
| 1277 | case TAG_IDENT_PVD: /* ISO 13346 3/10.1 */ | 1115 | case TAG_IDENT_PVD: /* ISO 13346 3/10.1 */ |
| 1278 | if (vdsn >= vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum) { | 1116 | if (vdsn >= vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum) { |
| 1279 | vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum = | 1117 | vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum = vdsn; |
| 1280 | vdsn; | ||
| 1281 | vds[VDS_POS_PRIMARY_VOL_DESC].block = block; | 1118 | vds[VDS_POS_PRIMARY_VOL_DESC].block = block; |
| 1282 | } | 1119 | } |
| 1283 | break; | 1120 | break; |
| 1284 | case TAG_IDENT_VDP: /* ISO 13346 3/10.3 */ | 1121 | case TAG_IDENT_VDP: /* ISO 13346 3/10.3 */ |
| 1285 | if (vdsn >= vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum) { | 1122 | if (vdsn >= vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum) { |
| 1286 | vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum = vdsn; | 1123 | vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum = vdsn; |
| 1287 | vds[VDS_POS_VOL_DESC_PTR].block = block; | 1124 | vds[VDS_POS_VOL_DESC_PTR].block = block; |
| 1288 | 1125 | ||
| 1289 | vdp = (struct volDescPtr *)bh->b_data; | 1126 | vdp = (struct volDescPtr *)bh->b_data; |
| 1290 | next_s = | 1127 | next_s = le32_to_cpu(vdp->nextVolDescSeqExt.extLocation); |
| 1291 | le32_to_cpu(vdp->nextVolDescSeqExt. | 1128 | next_e = le32_to_cpu(vdp->nextVolDescSeqExt.extLength); |
| 1292 | extLocation); | ||
| 1293 | next_e = | ||
| 1294 | le32_to_cpu(vdp->nextVolDescSeqExt. | ||
| 1295 | extLength); | ||
| 1296 | next_e = next_e >> sb->s_blocksize_bits; | 1129 | next_e = next_e >> sb->s_blocksize_bits; |
| 1297 | next_e += next_s; | 1130 | next_e += next_s; |
| 1298 | } | 1131 | } |
| 1299 | break; | 1132 | break; |
| 1300 | case TAG_IDENT_IUVD: /* ISO 13346 3/10.4 */ | 1133 | case TAG_IDENT_IUVD: /* ISO 13346 3/10.4 */ |
| 1301 | if (vdsn >= vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum) { | 1134 | if (vdsn >= vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum) { |
| 1302 | vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum = | 1135 | vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum = vdsn; |
| 1303 | vdsn; | ||
| 1304 | vds[VDS_POS_IMP_USE_VOL_DESC].block = block; | 1136 | vds[VDS_POS_IMP_USE_VOL_DESC].block = block; |
| 1305 | } | 1137 | } |
| 1306 | break; | 1138 | break; |
| 1307 | case TAG_IDENT_PD: /* ISO 13346 3/10.5 */ | 1139 | case TAG_IDENT_PD: /* ISO 13346 3/10.5 */ |
| 1308 | if (!vds[VDS_POS_PARTITION_DESC].block) | 1140 | if (!vds[VDS_POS_PARTITION_DESC].block) |
| 1309 | vds[VDS_POS_PARTITION_DESC].block = block; | 1141 | vds[VDS_POS_PARTITION_DESC].block = block; |
| 1310 | break; | 1142 | break; |
| 1311 | case TAG_IDENT_LVD: /* ISO 13346 3/10.6 */ | 1143 | case TAG_IDENT_LVD: /* ISO 13346 3/10.6 */ |
| 1312 | if (vdsn >= vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum) { | 1144 | if (vdsn >= vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum) { |
| 1313 | vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum = | 1145 | vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum = vdsn; |
| 1314 | vdsn; | ||
| 1315 | vds[VDS_POS_LOGICAL_VOL_DESC].block = block; | 1146 | vds[VDS_POS_LOGICAL_VOL_DESC].block = block; |
| 1316 | } | 1147 | } |
| 1317 | break; | 1148 | break; |
| 1318 | case TAG_IDENT_USD: /* ISO 13346 3/10.8 */ | 1149 | case TAG_IDENT_USD: /* ISO 13346 3/10.8 */ |
| 1319 | if (vdsn >= | 1150 | if (vdsn >= vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum) { |
| 1320 | vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum) { | 1151 | vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum = vdsn; |
| 1321 | vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum = | ||
| 1322 | vdsn; | ||
| 1323 | vds[VDS_POS_UNALLOC_SPACE_DESC].block = block; | 1152 | vds[VDS_POS_UNALLOC_SPACE_DESC].block = block; |
| 1324 | } | 1153 | } |
| 1325 | break; | 1154 | break; |
| 1326 | case TAG_IDENT_TD: /* ISO 13346 3/10.9 */ | 1155 | case TAG_IDENT_TD: /* ISO 13346 3/10.9 */ |
| 1327 | vds[VDS_POS_TERMINATING_DESC].block = block; | 1156 | vds[VDS_POS_TERMINATING_DESC].block = block; |
| 1328 | if (next_e) { | 1157 | if (next_e) { |
| 1329 | block = next_s; | 1158 | block = next_s; |
| 1330 | lastblock = next_e; | 1159 | lastblock = next_e; |
| 1331 | next_s = next_e = 0; | 1160 | next_s = next_e = 0; |
| 1332 | } else | 1161 | } else { |
| 1333 | done = 1; | 1162 | done = 1; |
| 1163 | } | ||
| 1334 | break; | 1164 | break; |
| 1335 | } | 1165 | } |
| 1336 | brelse(bh); | 1166 | brelse(bh); |
| 1337 | } | 1167 | } |
| 1338 | for (i = 0; i < VDS_POS_LENGTH; i++) { | 1168 | for (i = 0; i < VDS_POS_LENGTH; i++) { |
| 1339 | if (vds[i].block) { | 1169 | if (vds[i].block) { |
| 1340 | bh = udf_read_tagged(sb, vds[i].block, vds[i].block, | 1170 | bh = udf_read_tagged(sb, vds[i].block, vds[i].block, &ident); |
| 1341 | &ident); | ||
| 1342 | 1171 | ||
| 1343 | if (i == VDS_POS_PRIMARY_VOL_DESC) | 1172 | if (i == VDS_POS_PRIMARY_VOL_DESC) { |
| 1344 | udf_load_pvoldesc(sb, bh); | 1173 | udf_load_pvoldesc(sb, bh); |
| 1345 | else if (i == VDS_POS_LOGICAL_VOL_DESC) | 1174 | } else if (i == VDS_POS_LOGICAL_VOL_DESC) { |
| 1346 | udf_load_logicalvol(sb, bh, fileset); | 1175 | udf_load_logicalvol(sb, bh, fileset); |
| 1347 | else if (i == VDS_POS_PARTITION_DESC) { | 1176 | } else if (i == VDS_POS_PARTITION_DESC) { |
| 1348 | struct buffer_head *bh2 = NULL; | 1177 | struct buffer_head *bh2 = NULL; |
| 1349 | udf_load_partdesc(sb, bh); | 1178 | udf_load_partdesc(sb, bh); |
| 1350 | for (j = vds[i].block + 1; | 1179 | for (j = vds[i].block + 1; j < vds[VDS_POS_TERMINATING_DESC].block; j++) { |
| 1351 | j < vds[VDS_POS_TERMINATING_DESC].block; | ||
| 1352 | j++) { | ||
| 1353 | bh2 = udf_read_tagged(sb, j, j, &ident); | 1180 | bh2 = udf_read_tagged(sb, j, j, &ident); |
| 1354 | gd = (struct generic_desc *)bh2->b_data; | 1181 | gd = (struct generic_desc *)bh2->b_data; |
| 1355 | if (ident == TAG_IDENT_PD) | 1182 | if (ident == TAG_IDENT_PD) |
| @@ -1378,16 +1205,17 @@ static int udf_check_valid(struct super_block *sb, int novrs, int silent) | |||
| 1378 | /* Check that it is NSR02 compliant */ | 1205 | /* Check that it is NSR02 compliant */ |
| 1379 | /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ | 1206 | /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ |
| 1380 | else if ((block = udf_vrs(sb, silent)) == -1) { | 1207 | else if ((block = udf_vrs(sb, silent)) == -1) { |
| 1381 | udf_debug | 1208 | udf_debug("Failed to read byte 32768. Assuming open disc. " |
| 1382 | ("Failed to read byte 32768. Assuming open disc. Skipping validity check\n"); | 1209 | "Skipping validity check\n"); |
| 1383 | if (!UDF_SB_LASTBLOCK(sb)) | 1210 | if (!UDF_SB_LASTBLOCK(sb)) |
| 1384 | UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb); | 1211 | UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb); |
| 1385 | return 0; | 1212 | return 0; |
| 1386 | } else | 1213 | } else { |
| 1387 | return !block; | 1214 | return !block; |
| 1215 | } | ||
| 1388 | } | 1216 | } |
| 1389 | 1217 | ||
| 1390 | static int udf_load_partition(struct super_block *sb, kernel_lb_addr * fileset) | 1218 | static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) |
| 1391 | { | 1219 | { |
| 1392 | struct anchorVolDescPtr *anchor; | 1220 | struct anchorVolDescPtr *anchor; |
| 1393 | uint16_t ident; | 1221 | uint16_t ident; |
| @@ -1399,28 +1227,20 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr * fileset) | |||
| 1399 | return 1; | 1227 | return 1; |
| 1400 | 1228 | ||
| 1401 | for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) { | 1229 | for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) { |
| 1402 | if (UDF_SB_ANCHOR(sb)[i] && (bh = udf_read_tagged(sb, | 1230 | if (UDF_SB_ANCHOR(sb)[i] && |
| 1403 | UDF_SB_ANCHOR | 1231 | (bh = udf_read_tagged(sb, UDF_SB_ANCHOR(sb)[i], |
| 1404 | (sb)[i], | 1232 | UDF_SB_ANCHOR(sb)[i], &ident))) { |
| 1405 | UDF_SB_ANCHOR | ||
| 1406 | (sb)[i], | ||
| 1407 | &ident))) { | ||
| 1408 | anchor = (struct anchorVolDescPtr *)bh->b_data; | 1233 | anchor = (struct anchorVolDescPtr *)bh->b_data; |
| 1409 | 1234 | ||
| 1410 | /* Locate the main sequence */ | 1235 | /* Locate the main sequence */ |
| 1411 | main_s = | 1236 | main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation); |
| 1412 | le32_to_cpu(anchor->mainVolDescSeqExt.extLocation); | 1237 | main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength ); |
| 1413 | main_e = | ||
| 1414 | le32_to_cpu(anchor->mainVolDescSeqExt.extLength); | ||
| 1415 | main_e = main_e >> sb->s_blocksize_bits; | 1238 | main_e = main_e >> sb->s_blocksize_bits; |
| 1416 | main_e += main_s; | 1239 | main_e += main_s; |
| 1417 | 1240 | ||
| 1418 | /* Locate the reserve sequence */ | 1241 | /* Locate the reserve sequence */ |
| 1419 | reserve_s = | 1242 | reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation); |
| 1420 | le32_to_cpu(anchor->reserveVolDescSeqExt. | 1243 | reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength); |
| 1421 | extLocation); | ||
| 1422 | reserve_e = | ||
| 1423 | le32_to_cpu(anchor->reserveVolDescSeqExt.extLength); | ||
| 1424 | reserve_e = reserve_e >> sb->s_blocksize_bits; | 1244 | reserve_e = reserve_e >> sb->s_blocksize_bits; |
| 1425 | reserve_e += reserve_s; | 1245 | reserve_e += reserve_s; |
| 1426 | 1246 | ||
| @@ -1428,10 +1248,8 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr * fileset) | |||
| 1428 | 1248 | ||
| 1429 | /* Process the main & reserve sequences */ | 1249 | /* Process the main & reserve sequences */ |
| 1430 | /* responsible for finding the PartitionDesc(s) */ | 1250 | /* responsible for finding the PartitionDesc(s) */ |
| 1431 | if (! | 1251 | if (!(udf_process_sequence(sb, main_s, main_e, fileset) && |
| 1432 | (udf_process_sequence(sb, main_s, main_e, fileset) | 1252 | udf_process_sequence(sb, reserve_s, reserve_e, fileset))) { |
| 1433 | && udf_process_sequence(sb, reserve_s, reserve_e, | ||
| 1434 | fileset))) { | ||
| 1435 | break; | 1253 | break; |
| 1436 | } | 1254 | } |
| 1437 | } | 1255 | } |
| @@ -1444,81 +1262,67 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr * fileset) | |||
| 1444 | udf_debug("Using anchor in block %d\n", UDF_SB_ANCHOR(sb)[i]); | 1262 | udf_debug("Using anchor in block %d\n", UDF_SB_ANCHOR(sb)[i]); |
| 1445 | 1263 | ||
| 1446 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { | 1264 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { |
| 1265 | kernel_lb_addr uninitialized_var(ino); | ||
| 1447 | switch (UDF_SB_PARTTYPE(sb, i)) { | 1266 | switch (UDF_SB_PARTTYPE(sb, i)) { |
| 1448 | case UDF_VIRTUAL_MAP15: | 1267 | case UDF_VIRTUAL_MAP15: |
| 1449 | case UDF_VIRTUAL_MAP20: | 1268 | case UDF_VIRTUAL_MAP20: |
| 1450 | { | 1269 | if (!UDF_SB_LASTBLOCK(sb)) { |
| 1451 | kernel_lb_addr uninitialized_var(ino); | 1270 | UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb); |
| 1271 | udf_find_anchor(sb); | ||
| 1272 | } | ||
| 1452 | 1273 | ||
| 1453 | if (!UDF_SB_LASTBLOCK(sb)) { | 1274 | if (!UDF_SB_LASTBLOCK(sb)) { |
| 1454 | UDF_SB_LASTBLOCK(sb) = | 1275 | udf_debug("Unable to determine Lastblock (For " |
| 1455 | udf_get_last_block(sb); | 1276 | "Virtual Partition)\n"); |
| 1456 | udf_find_anchor(sb); | 1277 | return 1; |
| 1457 | } | 1278 | } |
| 1458 | 1279 | ||
| 1459 | if (!UDF_SB_LASTBLOCK(sb)) { | 1280 | for (j = 0; j < UDF_SB_NUMPARTS(sb); j++) { |
| 1460 | udf_debug | 1281 | if (j != i && UDF_SB_PARTVSN(sb, i) == |
| 1461 | ("Unable to determine Lastblock (For Virtual Partition)\n"); | 1282 | UDF_SB_PARTVSN(sb, j) && |
| 1462 | return 1; | 1283 | UDF_SB_PARTNUM(sb, i) == |
| 1284 | UDF_SB_PARTNUM(sb, j)) { | ||
| 1285 | ino.partitionReferenceNum = j; | ||
| 1286 | ino.logicalBlockNum = | ||
| 1287 | UDF_SB_LASTBLOCK(sb) - | ||
| 1288 | UDF_SB_PARTROOT(sb, j); | ||
| 1289 | break; | ||
| 1463 | } | 1290 | } |
| 1291 | } | ||
| 1464 | 1292 | ||
| 1465 | for (j = 0; j < UDF_SB_NUMPARTS(sb); j++) { | 1293 | if (j == UDF_SB_NUMPARTS(sb)) |
| 1466 | if (j != i && | 1294 | return 1; |
| 1467 | UDF_SB_PARTVSN(sb, | ||
| 1468 | i) == | ||
| 1469 | UDF_SB_PARTVSN(sb, j) | ||
| 1470 | && UDF_SB_PARTNUM(sb, | ||
| 1471 | i) == | ||
| 1472 | UDF_SB_PARTNUM(sb, j)) { | ||
| 1473 | ino.partitionReferenceNum = j; | ||
| 1474 | ino.logicalBlockNum = | ||
| 1475 | UDF_SB_LASTBLOCK(sb) - | ||
| 1476 | UDF_SB_PARTROOT(sb, j); | ||
| 1477 | break; | ||
| 1478 | } | ||
| 1479 | } | ||
| 1480 | 1295 | ||
| 1481 | if (j == UDF_SB_NUMPARTS(sb)) | 1296 | if (!(UDF_SB_VAT(sb) = udf_iget(sb, ino))) |
| 1482 | return 1; | 1297 | return 1; |
| 1483 | 1298 | ||
| 1484 | if (!(UDF_SB_VAT(sb) = udf_iget(sb, ino))) | 1299 | if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP15) { |
| 1485 | return 1; | 1300 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = |
| 1301 | udf_ext0_offset(UDF_SB_VAT(sb)); | ||
| 1302 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = | ||
| 1303 | (UDF_SB_VAT(sb)->i_size - 36) >> 2; | ||
| 1304 | } else if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP20) { | ||
| 1305 | struct buffer_head *bh = NULL; | ||
| 1306 | uint32_t pos; | ||
| 1486 | 1307 | ||
| 1487 | if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP15) { | 1308 | pos = udf_block_map(UDF_SB_VAT(sb), 0); |
| 1488 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = | 1309 | bh = sb_bread(sb, pos); |
| 1489 | udf_ext0_offset(UDF_SB_VAT(sb)); | 1310 | if (!bh) |
| 1490 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = | 1311 | return 1; |
| 1491 | (UDF_SB_VAT(sb)->i_size - 36) >> 2; | 1312 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = |
| 1492 | } else if (UDF_SB_PARTTYPE(sb, i) == | 1313 | le16_to_cpu(((struct |
| 1493 | UDF_VIRTUAL_MAP20) { | 1314 | virtualAllocationTable20 *)bh->b_data + |
| 1494 | struct buffer_head *bh = NULL; | 1315 | udf_ext0_offset(UDF_SB_VAT(sb)))-> |
| 1495 | uint32_t pos; | 1316 | lengthHeader) + |
| 1496 | 1317 | udf_ext0_offset(UDF_SB_VAT(sb)); | |
| 1497 | pos = udf_block_map(UDF_SB_VAT(sb), 0); | 1318 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = |
| 1498 | bh = sb_bread(sb, pos); | 1319 | (UDF_SB_VAT(sb)->i_size - |
| 1499 | if (!bh) | 1320 | UDF_SB_TYPEVIRT(sb, i).s_start_offset) >> 2; |
| 1500 | return 1; | 1321 | brelse(bh); |
| 1501 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = | ||
| 1502 | le16_to_cpu(((struct | ||
| 1503 | virtualAllocationTable20 | ||
| 1504 | *)bh->b_data + | ||
| 1505 | udf_ext0_offset | ||
| 1506 | (UDF_SB_VAT(sb)))-> | ||
| 1507 | lengthHeader) + | ||
| 1508 | udf_ext0_offset(UDF_SB_VAT(sb)); | ||
| 1509 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = | ||
| 1510 | (UDF_SB_VAT(sb)->i_size - | ||
| 1511 | UDF_SB_TYPEVIRT(sb, | ||
| 1512 | i). | ||
| 1513 | s_start_offset) >> 2; | ||
| 1514 | brelse(bh); | ||
| 1515 | } | ||
| 1516 | UDF_SB_PARTROOT(sb, i) = | ||
| 1517 | udf_get_pblock(sb, 0, i, 0); | ||
| 1518 | UDF_SB_PARTLEN(sb, i) = | ||
| 1519 | UDF_SB_PARTLEN(sb, | ||
| 1520 | ino.partitionReferenceNum); | ||
| 1521 | } | 1322 | } |
| 1323 | UDF_SB_PARTROOT(sb, i) = udf_get_pblock(sb, 0, i, 0); | ||
| 1324 | UDF_SB_PARTLEN(sb, i) = UDF_SB_PARTLEN(sb, | ||
| 1325 | ino.partitionReferenceNum); | ||
| 1522 | } | 1326 | } |
| 1523 | } | 1327 | } |
| 1524 | return 0; | 1328 | return 0; |
| @@ -1555,42 +1359,32 @@ static void udf_open_lvid(struct super_block *sb) | |||
| 1555 | 1359 | ||
| 1556 | static void udf_close_lvid(struct super_block *sb) | 1360 | static void udf_close_lvid(struct super_block *sb) |
| 1557 | { | 1361 | { |
| 1362 | kernel_timestamp cpu_time; | ||
| 1363 | int i; | ||
| 1364 | |||
| 1558 | if (UDF_SB_LVIDBH(sb) && | 1365 | if (UDF_SB_LVIDBH(sb) && |
| 1559 | UDF_SB_LVID(sb)->integrityType == LVID_INTEGRITY_TYPE_OPEN) { | 1366 | UDF_SB_LVID(sb)->integrityType == LVID_INTEGRITY_TYPE_OPEN) { |
| 1560 | int i; | ||
| 1561 | kernel_timestamp cpu_time; | ||
| 1562 | |||
| 1563 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | 1367 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; |
| 1564 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1368 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; |
| 1565 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) | 1369 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) |
| 1566 | UDF_SB_LVID(sb)->recordingDateAndTime = | 1370 | UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time); |
| 1567 | cpu_to_lets(cpu_time); | 1371 | if (UDF_MAX_WRITE_VERSION > le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev)) |
| 1568 | if (UDF_MAX_WRITE_VERSION > | 1372 | UDF_SB_LVIDIU(sb)->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION); |
| 1569 | le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev)) | 1373 | if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev)) |
| 1570 | UDF_SB_LVIDIU(sb)->maxUDFWriteRev = | 1374 | UDF_SB_LVIDIU(sb)->minUDFReadRev = cpu_to_le16(UDF_SB_UDFREV(sb)); |
| 1571 | cpu_to_le16(UDF_MAX_WRITE_VERSION); | 1375 | if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev)) |
| 1572 | if (UDF_SB_UDFREV(sb) > | 1376 | UDF_SB_LVIDIU(sb)->minUDFWriteRev = cpu_to_le16(UDF_SB_UDFREV(sb)); |
| 1573 | le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev)) | 1377 | UDF_SB_LVID(sb)->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); |
| 1574 | UDF_SB_LVIDIU(sb)->minUDFReadRev = | ||
| 1575 | cpu_to_le16(UDF_SB_UDFREV(sb)); | ||
| 1576 | if (UDF_SB_UDFREV(sb) > | ||
| 1577 | le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev)) | ||
| 1578 | UDF_SB_LVIDIU(sb)->minUDFWriteRev = | ||
| 1579 | cpu_to_le16(UDF_SB_UDFREV(sb)); | ||
| 1580 | UDF_SB_LVID(sb)->integrityType = | ||
| 1581 | cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); | ||
| 1582 | 1378 | ||
| 1583 | UDF_SB_LVID(sb)->descTag.descCRC = | 1379 | UDF_SB_LVID(sb)->descTag.descCRC = |
| 1584 | cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), | 1380 | cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), |
| 1585 | le16_to_cpu(UDF_SB_LVID(sb)->descTag. | 1381 | le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0)); |
| 1586 | descCRCLength), 0)); | ||
| 1587 | 1382 | ||
| 1588 | UDF_SB_LVID(sb)->descTag.tagChecksum = 0; | 1383 | UDF_SB_LVID(sb)->descTag.tagChecksum = 0; |
| 1589 | for (i = 0; i < 16; i++) | 1384 | for (i = 0; i < 16; i++) |
| 1590 | if (i != 4) | 1385 | if (i != 4) |
| 1591 | UDF_SB_LVID(sb)->descTag.tagChecksum += | 1386 | UDF_SB_LVID(sb)->descTag.tagChecksum += |
| 1592 | ((uint8_t *) & | 1387 | ((uint8_t *)&(UDF_SB_LVID(sb)->descTag))[i]; |
| 1593 | (UDF_SB_LVID(sb)->descTag))[i]; | ||
| 1594 | 1388 | ||
| 1595 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 1389 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
| 1596 | } | 1390 | } |
| @@ -1628,6 +1422,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1628 | sbi = kmalloc(sizeof(struct udf_sb_info), GFP_KERNEL); | 1422 | sbi = kmalloc(sizeof(struct udf_sb_info), GFP_KERNEL); |
| 1629 | if (!sbi) | 1423 | if (!sbi) |
| 1630 | return -ENOMEM; | 1424 | return -ENOMEM; |
| 1425 | |||
| 1631 | sb->s_fs_info = sbi; | 1426 | sb->s_fs_info = sbi; |
| 1632 | memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info)); | 1427 | memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info)); |
| 1633 | 1428 | ||
| @@ -1679,7 +1474,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1679 | UDF_SB_ANCHOR(sb)[2] = uopt.anchor; | 1474 | UDF_SB_ANCHOR(sb)[2] = uopt.anchor; |
| 1680 | UDF_SB_ANCHOR(sb)[3] = 256; | 1475 | UDF_SB_ANCHOR(sb)[3] = 256; |
| 1681 | 1476 | ||
| 1682 | if (udf_check_valid(sb, uopt.novrs, silent)) { /* read volume recognition sequences */ | 1477 | if (udf_check_valid(sb, uopt.novrs, silent)) { /* read volume recognition sequences */ |
| 1683 | printk("UDF-fs: No VRS found\n"); | 1478 | printk("UDF-fs: No VRS found\n"); |
| 1684 | goto error_out; | 1479 | goto error_out; |
| 1685 | } | 1480 | } |
| @@ -1701,10 +1496,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1701 | udf_debug("Lastblock=%d\n", UDF_SB_LASTBLOCK(sb)); | 1496 | udf_debug("Lastblock=%d\n", UDF_SB_LASTBLOCK(sb)); |
| 1702 | 1497 | ||
| 1703 | if (UDF_SB_LVIDBH(sb)) { | 1498 | if (UDF_SB_LVIDBH(sb)) { |
| 1704 | uint16_t minUDFReadRev = | 1499 | uint16_t minUDFReadRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev); |
| 1705 | le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev); | 1500 | uint16_t minUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev); |
| 1706 | uint16_t minUDFWriteRev = | ||
| 1707 | le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev); | ||
| 1708 | /* uint16_t maxUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev); */ | 1501 | /* uint16_t maxUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev); */ |
| 1709 | 1502 | ||
| 1710 | if (minUDFReadRev > UDF_MAX_READ_VERSION) { | 1503 | if (minUDFReadRev > UDF_MAX_READ_VERSION) { |
| @@ -1729,10 +1522,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1729 | goto error_out; | 1522 | goto error_out; |
| 1730 | } | 1523 | } |
| 1731 | 1524 | ||
| 1732 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1525 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_READ_ONLY) { |
| 1733 | UDF_PART_FLAG_READ_ONLY) { | 1526 | printk("UDF-fs: Partition marked readonly; forcing readonly mount\n"); |
| 1734 | printk | ||
| 1735 | ("UDF-fs: Partition marked readonly; forcing readonly mount\n"); | ||
| 1736 | sb->s_flags |= MS_RDONLY; | 1527 | sb->s_flags |= MS_RDONLY; |
| 1737 | } | 1528 | } |
| 1738 | 1529 | ||
| @@ -1744,10 +1535,11 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1744 | if (!silent) { | 1535 | if (!silent) { |
| 1745 | kernel_timestamp ts; | 1536 | kernel_timestamp ts; |
| 1746 | udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb)); | 1537 | udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb)); |
| 1747 | udf_info | 1538 | udf_info("UDF %s (%s) Mounting volume '%s', " |
| 1748 | ("UDF %s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n", | 1539 | "timestamp %04u/%02u/%02u %02u:%02u (%x)\n", |
| 1749 | UDFFS_VERSION, UDFFS_DATE, UDF_SB_VOLIDENT(sb), ts.year, | 1540 | UDFFS_VERSION, UDFFS_DATE, |
| 1750 | ts.month, ts.day, ts.hour, ts.minute, ts.typeAndTimezone); | 1541 | UDF_SB_VOLIDENT(sb), ts.year, ts.month, ts.day, ts.hour, ts.minute, |
| 1542 | ts.typeAndTimezone); | ||
| 1751 | } | 1543 | } |
| 1752 | if (!(sb->s_flags & MS_RDONLY)) | 1544 | if (!(sb->s_flags & MS_RDONLY)) |
| 1753 | udf_open_lvid(sb); | 1545 | udf_open_lvid(sb); |
| @@ -1772,30 +1564,21 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1772 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 1564 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
| 1773 | return 0; | 1565 | return 0; |
| 1774 | 1566 | ||
| 1775 | error_out: | 1567 | error_out: |
| 1776 | if (UDF_SB_VAT(sb)) | 1568 | if (UDF_SB_VAT(sb)) |
| 1777 | iput(UDF_SB_VAT(sb)); | 1569 | iput(UDF_SB_VAT(sb)); |
| 1778 | if (UDF_SB_NUMPARTS(sb)) { | 1570 | if (UDF_SB_NUMPARTS(sb)) { |
| 1779 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1571 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) |
| 1780 | UDF_PART_FLAG_UNALLOC_TABLE) | 1572 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); |
| 1781 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace. | 1573 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) |
| 1782 | s_table); | 1574 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); |
| 1783 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1575 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) |
| 1784 | UDF_PART_FLAG_FREED_TABLE) | 1576 | UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb), s_uspace); |
| 1785 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace. | 1577 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) |
| 1786 | s_table); | 1578 | UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb), s_fspace); |
| 1787 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1579 | if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15) { |
| 1788 | UDF_PART_FLAG_UNALLOC_BITMAP) | ||
| 1789 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_uspace); | ||
| 1790 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | ||
| 1791 | UDF_PART_FLAG_FREED_BITMAP) | ||
| 1792 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_fspace); | ||
| 1793 | if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == | ||
| 1794 | UDF_SPARABLE_MAP15) { | ||
| 1795 | for (i = 0; i < 4; i++) | 1580 | for (i = 0; i < 4; i++) |
| 1796 | brelse(UDF_SB_TYPESPAR | 1581 | brelse(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]); |
| 1797 | (sb, | ||
| 1798 | UDF_SB_PARTITION(sb)).s_spar_map[i]); | ||
| 1799 | } | 1582 | } |
| 1800 | } | 1583 | } |
| 1801 | #ifdef CONFIG_UDF_NLS | 1584 | #ifdef CONFIG_UDF_NLS |
| @@ -1808,6 +1591,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1808 | UDF_SB_FREE(sb); | 1591 | UDF_SB_FREE(sb); |
| 1809 | kfree(sbi); | 1592 | kfree(sbi); |
| 1810 | sb->s_fs_info = NULL; | 1593 | sb->s_fs_info = NULL; |
| 1594 | |||
| 1811 | return -EINVAL; | 1595 | return -EINVAL; |
| 1812 | } | 1596 | } |
| 1813 | 1597 | ||
| @@ -1823,8 +1607,8 @@ void udf_error(struct super_block *sb, const char *function, | |||
| 1823 | va_start(args, fmt); | 1607 | va_start(args, fmt); |
| 1824 | vsnprintf(error_buf, sizeof(error_buf), fmt, args); | 1608 | vsnprintf(error_buf, sizeof(error_buf), fmt, args); |
| 1825 | va_end(args); | 1609 | va_end(args); |
| 1826 | printk(KERN_CRIT "UDF-fs error (device %s): %s: %s\n", | 1610 | printk (KERN_CRIT "UDF-fs error (device %s): %s: %s\n", |
| 1827 | sb->s_id, function, error_buf); | 1611 | sb->s_id, function, error_buf); |
| 1828 | } | 1612 | } |
| 1829 | 1613 | ||
| 1830 | void udf_warning(struct super_block *sb, const char *function, | 1614 | void udf_warning(struct super_block *sb, const char *function, |
| @@ -1859,26 +1643,17 @@ static void udf_put_super(struct super_block *sb) | |||
| 1859 | if (UDF_SB_VAT(sb)) | 1643 | if (UDF_SB_VAT(sb)) |
| 1860 | iput(UDF_SB_VAT(sb)); | 1644 | iput(UDF_SB_VAT(sb)); |
| 1861 | if (UDF_SB_NUMPARTS(sb)) { | 1645 | if (UDF_SB_NUMPARTS(sb)) { |
| 1862 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1646 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) |
| 1863 | UDF_PART_FLAG_UNALLOC_TABLE) | 1647 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); |
| 1864 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace. | 1648 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) |
| 1865 | s_table); | 1649 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); |
| 1866 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1650 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) |
| 1867 | UDF_PART_FLAG_FREED_TABLE) | 1651 | UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb), s_uspace); |
| 1868 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace. | 1652 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) |
| 1869 | s_table); | 1653 | UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb), s_fspace); |
| 1870 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1654 | if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15) { |
| 1871 | UDF_PART_FLAG_UNALLOC_BITMAP) | ||
| 1872 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_uspace); | ||
| 1873 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | ||
| 1874 | UDF_PART_FLAG_FREED_BITMAP) | ||
| 1875 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_fspace); | ||
| 1876 | if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == | ||
| 1877 | UDF_SPARABLE_MAP15) { | ||
| 1878 | for (i = 0; i < 4; i++) | 1655 | for (i = 0; i < 4; i++) |
| 1879 | brelse(UDF_SB_TYPESPAR | 1656 | brelse(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]); |
| 1880 | (sb, | ||
| 1881 | UDF_SB_PARTITION(sb)).s_spar_map[i]); | ||
| 1882 | } | 1657 | } |
| 1883 | } | 1658 | } |
| 1884 | #ifdef CONFIG_UDF_NLS | 1659 | #ifdef CONFIG_UDF_NLS |
| @@ -1917,8 +1692,7 @@ static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 1917 | buf->f_bavail = buf->f_bfree; | 1692 | buf->f_bavail = buf->f_bfree; |
| 1918 | buf->f_files = (UDF_SB_LVIDBH(sb) ? | 1693 | buf->f_files = (UDF_SB_LVIDBH(sb) ? |
| 1919 | (le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) + | 1694 | (le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) + |
| 1920 | le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs)) : 0) + | 1695 | le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs)) : 0) + buf->f_bfree; |
| 1921 | buf->f_bfree; | ||
| 1922 | buf->f_ffree = buf->f_bfree; | 1696 | buf->f_ffree = buf->f_bfree; |
| 1923 | /* __kernel_fsid_t f_fsid */ | 1697 | /* __kernel_fsid_t f_fsid */ |
| 1924 | buf->f_namelen = UDF_NAME_LEN - 2; | 1698 | buf->f_namelen = UDF_NAME_LEN - 2; |
| @@ -1930,8 +1704,7 @@ static unsigned char udf_bitmap_lookup[16] = { | |||
| 1930 | 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 | 1704 | 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 |
| 1931 | }; | 1705 | }; |
| 1932 | 1706 | ||
| 1933 | static unsigned int | 1707 | static unsigned int udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap) |
| 1934 | udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap) | ||
| 1935 | { | 1708 | { |
| 1936 | struct buffer_head *bh = NULL; | 1709 | struct buffer_head *bh = NULL; |
| 1937 | unsigned int accum = 0; | 1710 | unsigned int accum = 0; |
| @@ -1961,8 +1734,8 @@ udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap) | |||
| 1961 | 1734 | ||
| 1962 | bm = (struct spaceBitmapDesc *)bh->b_data; | 1735 | bm = (struct spaceBitmapDesc *)bh->b_data; |
| 1963 | bytes = le32_to_cpu(bm->numOfBytes); | 1736 | bytes = le32_to_cpu(bm->numOfBytes); |
| 1964 | index = sizeof(struct spaceBitmapDesc); /* offset in first block only */ | 1737 | index = sizeof(struct spaceBitmapDesc); /* offset in first block only */ |
| 1965 | ptr = (uint8_t *) bh->b_data; | 1738 | ptr = (uint8_t *)bh->b_data; |
| 1966 | 1739 | ||
| 1967 | while (bytes > 0) { | 1740 | while (bytes > 0) { |
| 1968 | while ((bytes > 0) && (index < sb->s_blocksize)) { | 1741 | while ((bytes > 0) && (index < sb->s_blocksize)) { |
| @@ -1981,19 +1754,18 @@ udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap) | |||
| 1981 | goto out; | 1754 | goto out; |
| 1982 | } | 1755 | } |
| 1983 | index = 0; | 1756 | index = 0; |
| 1984 | ptr = (uint8_t *) bh->b_data; | 1757 | ptr = (uint8_t *)bh->b_data; |
| 1985 | } | 1758 | } |
| 1986 | } | 1759 | } |
| 1987 | brelse(bh); | 1760 | brelse(bh); |
| 1988 | 1761 | ||
| 1989 | out: | 1762 | out: |
| 1990 | unlock_kernel(); | 1763 | unlock_kernel(); |
| 1991 | 1764 | ||
| 1992 | return accum; | 1765 | return accum; |
| 1993 | } | 1766 | } |
| 1994 | 1767 | ||
| 1995 | static unsigned int | 1768 | static unsigned int udf_count_free_table(struct super_block *sb, struct inode *table) |
| 1996 | udf_count_free_table(struct super_block *sb, struct inode *table) | ||
| 1997 | { | 1769 | { |
| 1998 | unsigned int accum = 0; | 1770 | unsigned int accum = 0; |
| 1999 | uint32_t elen; | 1771 | uint32_t elen; |
| @@ -2007,8 +1779,9 @@ udf_count_free_table(struct super_block *sb, struct inode *table) | |||
| 2007 | epos.offset = sizeof(struct unallocSpaceEntry); | 1779 | epos.offset = sizeof(struct unallocSpaceEntry); |
| 2008 | epos.bh = NULL; | 1780 | epos.bh = NULL; |
| 2009 | 1781 | ||
| 2010 | while ((etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) | 1782 | while ((etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) { |
| 2011 | accum += (elen >> table->i_sb->s_blocksize_bits); | 1783 | accum += (elen >> table->i_sb->s_blocksize_bits); |
| 1784 | } | ||
| 2012 | brelse(epos.bh); | 1785 | brelse(epos.bh); |
| 2013 | 1786 | ||
| 2014 | unlock_kernel(); | 1787 | unlock_kernel(); |
| @@ -2021,12 +1794,8 @@ static unsigned int udf_count_free(struct super_block *sb) | |||
| 2021 | unsigned int accum = 0; | 1794 | unsigned int accum = 0; |
| 2022 | 1795 | ||
| 2023 | if (UDF_SB_LVIDBH(sb)) { | 1796 | if (UDF_SB_LVIDBH(sb)) { |
| 2024 | if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > | 1797 | if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > UDF_SB_PARTITION(sb)) { |
| 2025 | UDF_SB_PARTITION(sb)) { | 1798 | accum = le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]); |
| 2026 | accum = | ||
| 2027 | le32_to_cpu(UDF_SB_LVID(sb)-> | ||
| 2028 | freeSpaceTable[UDF_SB_PARTITION(sb)]); | ||
| 2029 | |||
| 2030 | if (accum == 0xFFFFFFFF) | 1799 | if (accum == 0xFFFFFFFF) |
| 2031 | accum = 0; | 1800 | accum = 0; |
| 2032 | } | 1801 | } |
| @@ -2035,40 +1804,24 @@ static unsigned int udf_count_free(struct super_block *sb) | |||
| 2035 | if (accum) | 1804 | if (accum) |
| 2036 | return accum; | 1805 | return accum; |
| 2037 | 1806 | ||
| 2038 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1807 | if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) { |
| 2039 | UDF_PART_FLAG_UNALLOC_BITMAP) { | 1808 | accum += udf_count_free_bitmap(sb, |
| 2040 | accum += | 1809 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap); |
| 2041 | udf_count_free_bitmap(sb, | ||
| 2042 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION | ||
| 2043 | (sb)].s_uspace. | ||
| 2044 | s_bitmap); | ||
| 2045 | } | 1810 | } |
| 2046 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1811 | if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) { |
| 2047 | UDF_PART_FLAG_FREED_BITMAP) { | 1812 | accum += udf_count_free_bitmap(sb, |
| 2048 | accum += | 1813 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap); |
| 2049 | udf_count_free_bitmap(sb, | ||
| 2050 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION | ||
| 2051 | (sb)].s_fspace. | ||
| 2052 | s_bitmap); | ||
| 2053 | } | 1814 | } |
| 2054 | if (accum) | 1815 | if (accum) |
| 2055 | return accum; | 1816 | return accum; |
| 2056 | 1817 | ||
| 2057 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1818 | if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 2058 | UDF_PART_FLAG_UNALLOC_TABLE) { | 1819 | accum += udf_count_free_table(sb, |
| 2059 | accum += | 1820 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); |
| 2060 | udf_count_free_table(sb, | ||
| 2061 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION | ||
| 2062 | (sb)].s_uspace. | ||
| 2063 | s_table); | ||
| 2064 | } | 1821 | } |
| 2065 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & | 1822 | if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) { |
| 2066 | UDF_PART_FLAG_FREED_TABLE) { | 1823 | accum += udf_count_free_table(sb, |
| 2067 | accum += | 1824 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); |
| 2068 | udf_count_free_table(sb, | ||
| 2069 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION | ||
| 2070 | (sb)].s_fspace. | ||
| 2071 | s_table); | ||
| 2072 | } | 1825 | } |
| 2073 | 1826 | ||
| 2074 | return accum; | 1827 | return accum; |
diff --git a/fs/udf/symlink.c b/fs/udf/symlink.c index c4b82a920082..e6f933dd6a7b 100644 --- a/fs/udf/symlink.c +++ b/fs/udf/symlink.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * Each contributing author retains all rights to their own work. | 11 | * Each contributing author retains all rights to their own work. |
| 12 | * | 12 | * |
| 13 | * (C) 1998-2001 Ben Fennema | 13 | * (C) 1998-2001 Ben Fennema |
| 14 | * (C) 1999 Stelias Computing Inc | 14 | * (C) 1999 Stelias Computing Inc |
| 15 | * | 15 | * |
| 16 | * HISTORY | 16 | * HISTORY |
| 17 | * | 17 | * |
| @@ -33,8 +33,7 @@ | |||
| 33 | #include <linux/buffer_head.h> | 33 | #include <linux/buffer_head.h> |
| 34 | #include "udf_i.h" | 34 | #include "udf_i.h" |
| 35 | 35 | ||
| 36 | static void udf_pc_to_char(struct super_block *sb, char *from, int fromlen, | 36 | static void udf_pc_to_char(struct super_block *sb, char *from, int fromlen, char *to) |
| 37 | char *to) | ||
| 38 | { | 37 | { |
| 39 | struct pathComponent *pc; | 38 | struct pathComponent *pc; |
| 40 | int elen = 0; | 39 | int elen = 0; |
| @@ -81,9 +80,9 @@ static int udf_symlink_filler(struct file *file, struct page *page) | |||
| 81 | char *p = kmap(page); | 80 | char *p = kmap(page); |
| 82 | 81 | ||
| 83 | lock_kernel(); | 82 | lock_kernel(); |
| 84 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) | 83 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) { |
| 85 | symlink = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode); | 84 | symlink = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode); |
| 86 | else { | 85 | } else { |
| 87 | bh = sb_bread(inode->i_sb, udf_block_map(inode, 0)); | 86 | bh = sb_bread(inode->i_sb, udf_block_map(inode, 0)); |
| 88 | 87 | ||
| 89 | if (!bh) | 88 | if (!bh) |
| @@ -100,7 +99,8 @@ static int udf_symlink_filler(struct file *file, struct page *page) | |||
| 100 | kunmap(page); | 99 | kunmap(page); |
| 101 | unlock_page(page); | 100 | unlock_page(page); |
| 102 | return 0; | 101 | return 0; |
| 103 | out: | 102 | |
| 103 | out: | ||
| 104 | unlock_kernel(); | 104 | unlock_kernel(); |
| 105 | SetPageError(page); | 105 | SetPageError(page); |
| 106 | kunmap(page); | 106 | kunmap(page); |
| @@ -112,5 +112,5 @@ static int udf_symlink_filler(struct file *file, struct page *page) | |||
| 112 | * symlinks can't do much... | 112 | * symlinks can't do much... |
| 113 | */ | 113 | */ |
| 114 | const struct address_space_operations udf_symlink_aops = { | 114 | const struct address_space_operations udf_symlink_aops = { |
| 115 | .readpage = udf_symlink_filler, | 115 | .readpage = udf_symlink_filler, |
| 116 | }; | 116 | }; |
diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index b2002da0a5c0..7fc3912885a5 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c | |||
| @@ -32,13 +32,11 @@ static void extent_trunc(struct inode *inode, struct extent_position *epos, | |||
| 32 | kernel_lb_addr eloc, int8_t etype, uint32_t elen, | 32 | kernel_lb_addr eloc, int8_t etype, uint32_t elen, |
| 33 | uint32_t nelen) | 33 | uint32_t nelen) |
| 34 | { | 34 | { |
| 35 | kernel_lb_addr neloc = { 0, 0 }; | 35 | kernel_lb_addr neloc = {}; |
| 36 | int last_block = | 36 | int last_block = (elen + inode->i_sb->s_blocksize - 1) >> |
| 37 | (elen + inode->i_sb->s_blocksize - | 37 | inode->i_sb->s_blocksize_bits; |
| 38 | 1) >> inode->i_sb->s_blocksize_bits; | 38 | int first_block = (nelen + inode->i_sb->s_blocksize - 1) >> |
| 39 | int first_block = | 39 | inode->i_sb->s_blocksize_bits; |
| 40 | (nelen + inode->i_sb->s_blocksize - | ||
| 41 | 1) >> inode->i_sb->s_blocksize_bits; | ||
| 42 | 40 | ||
| 43 | if (nelen) { | 41 | if (nelen) { |
| 44 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { | 42 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
| @@ -70,7 +68,7 @@ static void extent_trunc(struct inode *inode, struct extent_position *epos, | |||
| 70 | */ | 68 | */ |
| 71 | void udf_truncate_tail_extent(struct inode *inode) | 69 | void udf_truncate_tail_extent(struct inode *inode) |
| 72 | { | 70 | { |
| 73 | struct extent_position epos = { NULL, 0, {0, 0} }; | 71 | struct extent_position epos = {}; |
| 74 | kernel_lb_addr eloc; | 72 | kernel_lb_addr eloc; |
| 75 | uint32_t elen, nelen; | 73 | uint32_t elen, nelen; |
| 76 | uint64_t lbcount = 0; | 74 | uint64_t lbcount = 0; |
| @@ -156,16 +154,16 @@ void udf_discard_prealloc(struct inode *inode) | |||
| 156 | extent_trunc(inode, &epos, eloc, etype, elen, 0); | 154 | extent_trunc(inode, &epos, eloc, etype, elen, 0); |
| 157 | if (!epos.bh) { | 155 | if (!epos.bh) { |
| 158 | UDF_I_LENALLOC(inode) = | 156 | UDF_I_LENALLOC(inode) = |
| 159 | epos.offset - udf_file_entry_alloc_offset(inode); | 157 | epos.offset - udf_file_entry_alloc_offset(inode); |
| 160 | mark_inode_dirty(inode); | 158 | mark_inode_dirty(inode); |
| 161 | } else { | 159 | } else { |
| 162 | struct allocExtDesc *aed = | 160 | struct allocExtDesc *aed = |
| 163 | (struct allocExtDesc *)(epos.bh->b_data); | 161 | (struct allocExtDesc *)(epos.bh->b_data); |
| 164 | aed->lengthAllocDescs = | 162 | aed->lengthAllocDescs = |
| 165 | cpu_to_le32(epos.offset - | 163 | cpu_to_le32(epos.offset - |
| 166 | sizeof(struct allocExtDesc)); | 164 | sizeof(struct allocExtDesc)); |
| 167 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) | 165 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 168 | || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 166 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) |
| 169 | udf_update_tag(epos.bh->b_data, epos.offset); | 167 | udf_update_tag(epos.bh->b_data, epos.offset); |
| 170 | else | 168 | else |
| 171 | udf_update_tag(epos.bh->b_data, | 169 | udf_update_tag(epos.bh->b_data, |
| @@ -182,7 +180,7 @@ void udf_discard_prealloc(struct inode *inode) | |||
| 182 | void udf_truncate_extents(struct inode *inode) | 180 | void udf_truncate_extents(struct inode *inode) |
| 183 | { | 181 | { |
| 184 | struct extent_position epos; | 182 | struct extent_position epos; |
| 185 | kernel_lb_addr eloc, neloc = { 0, 0 }; | 183 | kernel_lb_addr eloc, neloc = {}; |
| 186 | uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc; | 184 | uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc; |
| 187 | int8_t etype; | 185 | int8_t etype; |
| 188 | struct super_block *sb = inode->i_sb; | 186 | struct super_block *sb = inode->i_sb; |
| @@ -198,9 +196,8 @@ void udf_truncate_extents(struct inode *inode) | |||
| 198 | BUG(); | 196 | BUG(); |
| 199 | 197 | ||
| 200 | etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset); | 198 | etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset); |
| 201 | byte_offset = | 199 | byte_offset = (offset << sb->s_blocksize_bits) + |
| 202 | (offset << sb->s_blocksize_bits) + | 200 | (inode->i_size & (sb->s_blocksize - 1)); |
| 203 | (inode->i_size & (sb->s_blocksize - 1)); | ||
| 204 | if (etype != -1) { | 201 | if (etype != -1) { |
| 205 | epos.offset -= adsize; | 202 | epos.offset -= adsize; |
| 206 | extent_trunc(inode, &epos, eloc, etype, elen, byte_offset); | 203 | extent_trunc(inode, &epos, eloc, etype, elen, byte_offset); |
| @@ -215,9 +212,7 @@ void udf_truncate_extents(struct inode *inode) | |||
| 215 | else | 212 | else |
| 216 | lenalloc -= sizeof(struct allocExtDesc); | 213 | lenalloc -= sizeof(struct allocExtDesc); |
| 217 | 214 | ||
| 218 | while ((etype = | 215 | while ((etype = udf_current_aext(inode, &epos, &eloc, &elen, 0)) != -1) { |
| 219 | udf_current_aext(inode, &epos, &eloc, &elen, | ||
| 220 | 0)) != -1) { | ||
| 221 | if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { | 216 | if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { |
| 222 | udf_write_aext(inode, &epos, neloc, nelen, 0); | 217 | udf_write_aext(inode, &epos, neloc, nelen, 0); |
| 223 | if (indirect_ext_len) { | 218 | if (indirect_ext_len) { |
| @@ -229,52 +224,35 @@ void udf_truncate_extents(struct inode *inode) | |||
| 229 | 0, indirect_ext_len); | 224 | 0, indirect_ext_len); |
| 230 | } else { | 225 | } else { |
| 231 | if (!epos.bh) { | 226 | if (!epos.bh) { |
| 232 | UDF_I_LENALLOC(inode) = | 227 | UDF_I_LENALLOC(inode) = lenalloc; |
| 233 | lenalloc; | ||
| 234 | mark_inode_dirty(inode); | 228 | mark_inode_dirty(inode); |
| 235 | } else { | 229 | } else { |
| 236 | struct allocExtDesc *aed = | 230 | struct allocExtDesc *aed = |
| 237 | (struct allocExtDesc | 231 | (struct allocExtDesc *)(epos.bh->b_data); |
| 238 | *)(epos.bh->b_data); | ||
| 239 | aed->lengthAllocDescs = | 232 | aed->lengthAllocDescs = |
| 240 | cpu_to_le32(lenalloc); | 233 | cpu_to_le32(lenalloc); |
| 241 | if (!UDF_QUERY_FLAG | 234 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || |
| 242 | (sb, UDF_FLAG_STRICT) | 235 | UDF_SB_UDFREV(sb) >= 0x0201) |
| 243 | || UDF_SB_UDFREV(sb) >= | 236 | udf_update_tag(epos.bh->b_data, |
| 244 | 0x0201) | 237 | lenalloc + |
| 245 | udf_update_tag(epos.bh-> | 238 | sizeof(struct allocExtDesc)); |
| 246 | b_data, | ||
| 247 | lenalloc | ||
| 248 | + | ||
| 249 | sizeof | ||
| 250 | (struct | ||
| 251 | allocExtDesc)); | ||
| 252 | else | 239 | else |
| 253 | udf_update_tag(epos.bh-> | 240 | udf_update_tag(epos.bh->b_data, |
| 254 | b_data, | 241 | sizeof(struct allocExtDesc)); |
| 255 | sizeof | 242 | mark_buffer_dirty_inode(epos.bh, inode); |
| 256 | (struct | ||
| 257 | allocExtDesc)); | ||
| 258 | mark_buffer_dirty_inode(epos.bh, | ||
| 259 | inode); | ||
| 260 | } | 243 | } |
| 261 | } | 244 | } |
| 262 | brelse(epos.bh); | 245 | brelse(epos.bh); |
| 263 | epos.offset = sizeof(struct allocExtDesc); | 246 | epos.offset = sizeof(struct allocExtDesc); |
| 264 | epos.block = eloc; | 247 | epos.block = eloc; |
| 265 | epos.bh = | 248 | epos.bh = udf_tread(sb, udf_get_lb_pblock(sb, eloc, 0)); |
| 266 | udf_tread(sb, | ||
| 267 | udf_get_lb_pblock(sb, eloc, 0)); | ||
| 268 | if (elen) | 249 | if (elen) |
| 269 | indirect_ext_len = (elen + | 250 | indirect_ext_len = (elen + sb->s_blocksize -1) >> |
| 270 | sb->s_blocksize - | 251 | sb->s_blocksize_bits; |
| 271 | 1) >> sb-> | ||
| 272 | s_blocksize_bits; | ||
| 273 | else | 252 | else |
| 274 | indirect_ext_len = 1; | 253 | indirect_ext_len = 1; |
| 275 | } else { | 254 | } else { |
| 276 | extent_trunc(inode, &epos, eloc, etype, elen, | 255 | extent_trunc(inode, &epos, eloc, etype, elen, 0); |
| 277 | 0); | ||
| 278 | epos.offset += adsize; | 256 | epos.offset += adsize; |
| 279 | } | 257 | } |
| 280 | } | 258 | } |
| @@ -292,16 +270,13 @@ void udf_truncate_extents(struct inode *inode) | |||
| 292 | struct allocExtDesc *aed = | 270 | struct allocExtDesc *aed = |
| 293 | (struct allocExtDesc *)(epos.bh->b_data); | 271 | (struct allocExtDesc *)(epos.bh->b_data); |
| 294 | aed->lengthAllocDescs = cpu_to_le32(lenalloc); | 272 | aed->lengthAllocDescs = cpu_to_le32(lenalloc); |
| 295 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) | 273 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || |
| 296 | || UDF_SB_UDFREV(sb) >= 0x0201) | 274 | UDF_SB_UDFREV(sb) >= 0x0201) |
| 297 | udf_update_tag(epos.bh->b_data, | 275 | udf_update_tag(epos.bh->b_data, |
| 298 | lenalloc + | 276 | lenalloc + sizeof(struct allocExtDesc)); |
| 299 | sizeof(struct | ||
| 300 | allocExtDesc)); | ||
| 301 | else | 277 | else |
| 302 | udf_update_tag(epos.bh->b_data, | 278 | udf_update_tag(epos.bh->b_data, |
| 303 | sizeof(struct | 279 | sizeof(struct allocExtDesc)); |
| 304 | allocExtDesc)); | ||
| 305 | mark_buffer_dirty_inode(epos.bh, inode); | 280 | mark_buffer_dirty_inode(epos.bh, inode); |
| 306 | } | 281 | } |
| 307 | } | 282 | } |
| @@ -314,21 +289,14 @@ void udf_truncate_extents(struct inode *inode) | |||
| 314 | * no extent above inode->i_size => truncate is | 289 | * no extent above inode->i_size => truncate is |
| 315 | * extending the file by 'offset' blocks. | 290 | * extending the file by 'offset' blocks. |
| 316 | */ | 291 | */ |
| 317 | if ((!epos.bh | 292 | if ((!epos.bh && |
| 318 | && epos.offset == | 293 | epos.offset == udf_file_entry_alloc_offset(inode)) || |
| 319 | udf_file_entry_alloc_offset(inode)) || (epos.bh | 294 | (epos.bh && epos.offset == sizeof(struct allocExtDesc))) { |
| 320 | && epos. | ||
| 321 | offset == | ||
| 322 | sizeof | ||
| 323 | (struct | ||
| 324 | allocExtDesc))) | ||
| 325 | { | ||
| 326 | /* File has no extents at all or has empty last | 295 | /* File has no extents at all or has empty last |
| 327 | * indirect extent! Create a fake extent... */ | 296 | * indirect extent! Create a fake extent... */ |
| 328 | extent.extLocation.logicalBlockNum = 0; | 297 | extent.extLocation.logicalBlockNum = 0; |
| 329 | extent.extLocation.partitionReferenceNum = 0; | 298 | extent.extLocation.partitionReferenceNum = 0; |
| 330 | extent.extLength = | 299 | extent.extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; |
| 331 | EXT_NOT_RECORDED_NOT_ALLOCATED; | ||
| 332 | } else { | 300 | } else { |
| 333 | epos.offset -= adsize; | 301 | epos.offset -= adsize; |
| 334 | etype = udf_next_aext(inode, &epos, | 302 | etype = udf_next_aext(inode, &epos, |
| @@ -337,10 +305,7 @@ void udf_truncate_extents(struct inode *inode) | |||
| 337 | extent.extLength |= etype << 30; | 305 | extent.extLength |= etype << 30; |
| 338 | } | 306 | } |
| 339 | udf_extend_file(inode, &epos, &extent, | 307 | udf_extend_file(inode, &epos, &extent, |
| 340 | offset + | 308 | offset + ((inode->i_size & (sb->s_blocksize - 1)) != 0)); |
| 341 | ((inode-> | ||
| 342 | i_size & (sb->s_blocksize - 1)) != | ||
| 343 | 0)); | ||
| 344 | } | 309 | } |
| 345 | } | 310 | } |
| 346 | UDF_I_LENEXTENTS(inode) = inode->i_size; | 311 | UDF_I_LENEXTENTS(inode) = inode->i_size; |
diff --git a/fs/udf/udf_i.h b/fs/udf/udf_i.h index bee4308a8113..d7dbe6f3ba0c 100644 --- a/fs/udf/udf_i.h +++ b/fs/udf/udf_i.h | |||
| @@ -23,4 +23,4 @@ static inline struct udf_inode_info *UDF_I(struct inode *inode) | |||
| 23 | #define UDF_I_LAD(X) ( UDF_I(X)->i_ext.i_lad ) | 23 | #define UDF_I_LAD(X) ( UDF_I(X)->i_ext.i_lad ) |
| 24 | #define UDF_I_DATA(X) ( UDF_I(X)->i_ext.i_data ) | 24 | #define UDF_I_DATA(X) ( UDF_I(X)->i_ext.i_data ) |
| 25 | 25 | ||
| 26 | #endif /* !defined(_LINUX_UDF_I_H) */ | 26 | #endif /* !defined(_LINUX_UDF_I_H) */ |
diff --git a/fs/udf/udf_sb.h b/fs/udf/udf_sb.h index 60f31d8cebee..3e937d3fb8f9 100644 --- a/fs/udf/udf_sb.h +++ b/fs/udf/udf_sb.h | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | #define UDF_FLAG_VARCONV 8 | 20 | #define UDF_FLAG_VARCONV 8 |
| 21 | #define UDF_FLAG_NLS_MAP 9 | 21 | #define UDF_FLAG_NLS_MAP 9 |
| 22 | #define UDF_FLAG_UTF8 10 | 22 | #define UDF_FLAG_UTF8 10 |
| 23 | #define UDF_FLAG_UID_FORGET 11 /* save -1 for uid to disk */ | 23 | #define UDF_FLAG_UID_FORGET 11 /* save -1 for uid to disk */ |
| 24 | #define UDF_FLAG_UID_IGNORE 12 /* use sb uid instead of on disk uid */ | 24 | #define UDF_FLAG_UID_IGNORE 12 /* use sb uid instead of on disk uid */ |
| 25 | #define UDF_FLAG_GID_FORGET 13 | 25 | #define UDF_FLAG_GID_FORGET 13 |
| 26 | #define UDF_FLAG_GID_IGNORE 14 | 26 | #define UDF_FLAG_GID_IGNORE 14 |
| 27 | 27 | ||
| @@ -41,8 +41,7 @@ static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | |||
| 41 | 41 | ||
| 42 | #define UDF_SB_FREE(X)\ | 42 | #define UDF_SB_FREE(X)\ |
| 43 | {\ | 43 | {\ |
| 44 | if (UDF_SB(X))\ | 44 | if (UDF_SB(X)) {\ |
| 45 | {\ | ||
| 46 | kfree(UDF_SB_PARTMAPS(X));\ | 45 | kfree(UDF_SB_PARTMAPS(X));\ |
| 47 | UDF_SB_PARTMAPS(X) = NULL;\ | 46 | UDF_SB_PARTMAPS(X) = NULL;\ |
| 48 | }\ | 47 | }\ |
| @@ -51,13 +50,10 @@ static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | |||
| 51 | #define UDF_SB_ALLOC_PARTMAPS(X,Y)\ | 50 | #define UDF_SB_ALLOC_PARTMAPS(X,Y)\ |
| 52 | {\ | 51 | {\ |
| 53 | UDF_SB_PARTMAPS(X) = kmalloc(sizeof(struct udf_part_map) * Y, GFP_KERNEL);\ | 52 | UDF_SB_PARTMAPS(X) = kmalloc(sizeof(struct udf_part_map) * Y, GFP_KERNEL);\ |
| 54 | if (UDF_SB_PARTMAPS(X) != NULL)\ | 53 | if (UDF_SB_PARTMAPS(X) != NULL) {\ |
| 55 | {\ | ||
| 56 | UDF_SB_NUMPARTS(X) = Y;\ | 54 | UDF_SB_NUMPARTS(X) = Y;\ |
| 57 | memset(UDF_SB_PARTMAPS(X), 0x00, sizeof(struct udf_part_map) * Y);\ | 55 | memset(UDF_SB_PARTMAPS(X), 0x00, sizeof(struct udf_part_map) * Y);\ |
| 58 | }\ | 56 | } else {\ |
| 59 | else\ | ||
| 60 | {\ | ||
| 61 | UDF_SB_NUMPARTS(X) = 0;\ | 57 | UDF_SB_NUMPARTS(X) = 0;\ |
| 62 | udf_error(X, __FUNCTION__, "Unable to allocate space for %d partition maps", Y);\ | 58 | udf_error(X, __FUNCTION__, "Unable to allocate space for %d partition maps", Y);\ |
| 63 | }\ | 59 | }\ |
| @@ -72,15 +68,12 @@ static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | |||
| 72 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap = kmalloc(size, GFP_KERNEL);\ | 68 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap = kmalloc(size, GFP_KERNEL);\ |
| 73 | else\ | 69 | else\ |
| 74 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap = vmalloc(size);\ | 70 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap = vmalloc(size);\ |
| 75 | if (UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap != NULL)\ | 71 | if (UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap != NULL) {\ |
| 76 | {\ | ||
| 77 | memset(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap, 0x00, size);\ | 72 | memset(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap, 0x00, size);\ |
| 78 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_block_bitmap =\ | 73 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_block_bitmap =\ |
| 79 | (struct buffer_head **)(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap + 1);\ | 74 | (struct buffer_head **)(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap + 1);\ |
| 80 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_nr_groups = nr_groups;\ | 75 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_nr_groups = nr_groups;\ |
| 81 | }\ | 76 | } else {\ |
| 82 | else\ | ||
| 83 | {\ | ||
| 84 | udf_error(X, __FUNCTION__, "Unable to allocate space for bitmap and %d buffer_head pointers", nr_groups);\ | 77 | udf_error(X, __FUNCTION__, "Unable to allocate space for bitmap and %d buffer_head pointers", nr_groups);\ |
| 85 | }\ | 78 | }\ |
| 86 | } | 79 | } |
| @@ -90,8 +83,7 @@ static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | |||
| 90 | int i;\ | 83 | int i;\ |
| 91 | int nr_groups = UDF_SB_BITMAP_NR_GROUPS(X,Y,Z);\ | 84 | int nr_groups = UDF_SB_BITMAP_NR_GROUPS(X,Y,Z);\ |
| 92 | int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * nr_groups);\ | 85 | int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * nr_groups);\ |
| 93 | for (i=0; i<nr_groups; i++)\ | 86 | for (i = 0; i < nr_groups; i++) {\ |
| 94 | {\ | ||
| 95 | if (UDF_SB_BITMAP(X,Y,Z,i))\ | 87 | if (UDF_SB_BITMAP(X,Y,Z,i))\ |
| 96 | brelse(UDF_SB_BITMAP(X,Y,Z,i));\ | 88 | brelse(UDF_SB_BITMAP(X,Y,Z,i));\ |
| 97 | }\ | 89 | }\ |
| @@ -139,4 +131,4 @@ static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | |||
| 139 | #define UDF_SB_FLAGS(X) ( UDF_SB(X)->s_flags ) | 131 | #define UDF_SB_FLAGS(X) ( UDF_SB(X)->s_flags ) |
| 140 | #define UDF_SB_VAT(X) ( UDF_SB(X)->s_vat ) | 132 | #define UDF_SB_VAT(X) ( UDF_SB(X)->s_vat ) |
| 141 | 133 | ||
| 142 | #endif /* __LINUX_UDF_SB_H */ | 134 | #endif /* __LINUX_UDF_SB_H */ |
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 76f2b82a39dc..c8016cc9e7e6 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
| @@ -63,8 +63,8 @@ struct udf_vds_record { | |||
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | struct generic_desc { | 65 | struct generic_desc { |
| 66 | tag descTag; | 66 | tag descTag; |
| 67 | __le32 volDescSeqNum; | 67 | __le32 volDescSeqNum; |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | struct ustr { | 70 | struct ustr { |
diff --git a/fs/udf/udfend.h b/fs/udf/udfend.h index 450daab35a13..c4bd1203f857 100644 --- a/fs/udf/udfend.h +++ b/fs/udf/udfend.h | |||
| @@ -7,75 +7,93 @@ | |||
| 7 | static inline kernel_lb_addr lelb_to_cpu(lb_addr in) | 7 | static inline kernel_lb_addr lelb_to_cpu(lb_addr in) |
| 8 | { | 8 | { |
| 9 | kernel_lb_addr out; | 9 | kernel_lb_addr out; |
| 10 | |||
| 10 | out.logicalBlockNum = le32_to_cpu(in.logicalBlockNum); | 11 | out.logicalBlockNum = le32_to_cpu(in.logicalBlockNum); |
| 11 | out.partitionReferenceNum = le16_to_cpu(in.partitionReferenceNum); | 12 | out.partitionReferenceNum = le16_to_cpu(in.partitionReferenceNum); |
| 13 | |||
| 12 | return out; | 14 | return out; |
| 13 | } | 15 | } |
| 14 | 16 | ||
| 15 | static inline lb_addr cpu_to_lelb(kernel_lb_addr in) | 17 | static inline lb_addr cpu_to_lelb(kernel_lb_addr in) |
| 16 | { | 18 | { |
| 17 | lb_addr out; | 19 | lb_addr out; |
| 20 | |||
| 18 | out.logicalBlockNum = cpu_to_le32(in.logicalBlockNum); | 21 | out.logicalBlockNum = cpu_to_le32(in.logicalBlockNum); |
| 19 | out.partitionReferenceNum = cpu_to_le16(in.partitionReferenceNum); | 22 | out.partitionReferenceNum = cpu_to_le16(in.partitionReferenceNum); |
| 23 | |||
| 20 | return out; | 24 | return out; |
| 21 | } | 25 | } |
| 22 | 26 | ||
| 23 | static inline kernel_timestamp lets_to_cpu(timestamp in) | 27 | static inline kernel_timestamp lets_to_cpu(timestamp in) |
| 24 | { | 28 | { |
| 25 | kernel_timestamp out; | 29 | kernel_timestamp out; |
| 30 | |||
| 26 | memcpy(&out, &in, sizeof(timestamp)); | 31 | memcpy(&out, &in, sizeof(timestamp)); |
| 27 | out.typeAndTimezone = le16_to_cpu(in.typeAndTimezone); | 32 | out.typeAndTimezone = le16_to_cpu(in.typeAndTimezone); |
| 28 | out.year = le16_to_cpu(in.year); | 33 | out.year = le16_to_cpu(in.year); |
| 34 | |||
| 29 | return out; | 35 | return out; |
| 30 | } | 36 | } |
| 31 | 37 | ||
| 32 | static inline short_ad lesa_to_cpu(short_ad in) | 38 | static inline short_ad lesa_to_cpu(short_ad in) |
| 33 | { | 39 | { |
| 34 | short_ad out; | 40 | short_ad out; |
| 41 | |||
| 35 | out.extLength = le32_to_cpu(in.extLength); | 42 | out.extLength = le32_to_cpu(in.extLength); |
| 36 | out.extPosition = le32_to_cpu(in.extPosition); | 43 | out.extPosition = le32_to_cpu(in.extPosition); |
| 44 | |||
| 37 | return out; | 45 | return out; |
| 38 | } | 46 | } |
| 39 | 47 | ||
| 40 | static inline short_ad cpu_to_lesa(short_ad in) | 48 | static inline short_ad cpu_to_lesa(short_ad in) |
| 41 | { | 49 | { |
| 42 | short_ad out; | 50 | short_ad out; |
| 51 | |||
| 43 | out.extLength = cpu_to_le32(in.extLength); | 52 | out.extLength = cpu_to_le32(in.extLength); |
| 44 | out.extPosition = cpu_to_le32(in.extPosition); | 53 | out.extPosition = cpu_to_le32(in.extPosition); |
| 54 | |||
| 45 | return out; | 55 | return out; |
| 46 | } | 56 | } |
| 47 | 57 | ||
| 48 | static inline kernel_long_ad lela_to_cpu(long_ad in) | 58 | static inline kernel_long_ad lela_to_cpu(long_ad in) |
| 49 | { | 59 | { |
| 50 | kernel_long_ad out; | 60 | kernel_long_ad out; |
| 61 | |||
| 51 | out.extLength = le32_to_cpu(in.extLength); | 62 | out.extLength = le32_to_cpu(in.extLength); |
| 52 | out.extLocation = lelb_to_cpu(in.extLocation); | 63 | out.extLocation = lelb_to_cpu(in.extLocation); |
| 64 | |||
| 53 | return out; | 65 | return out; |
| 54 | } | 66 | } |
| 55 | 67 | ||
| 56 | static inline long_ad cpu_to_lela(kernel_long_ad in) | 68 | static inline long_ad cpu_to_lela(kernel_long_ad in) |
| 57 | { | 69 | { |
| 58 | long_ad out; | 70 | long_ad out; |
| 71 | |||
| 59 | out.extLength = cpu_to_le32(in.extLength); | 72 | out.extLength = cpu_to_le32(in.extLength); |
| 60 | out.extLocation = cpu_to_lelb(in.extLocation); | 73 | out.extLocation = cpu_to_lelb(in.extLocation); |
| 74 | |||
| 61 | return out; | 75 | return out; |
| 62 | } | 76 | } |
| 63 | 77 | ||
| 64 | static inline kernel_extent_ad leea_to_cpu(extent_ad in) | 78 | static inline kernel_extent_ad leea_to_cpu(extent_ad in) |
| 65 | { | 79 | { |
| 66 | kernel_extent_ad out; | 80 | kernel_extent_ad out; |
| 81 | |||
| 67 | out.extLength = le32_to_cpu(in.extLength); | 82 | out.extLength = le32_to_cpu(in.extLength); |
| 68 | out.extLocation = le32_to_cpu(in.extLocation); | 83 | out.extLocation = le32_to_cpu(in.extLocation); |
| 84 | |||
| 69 | return out; | 85 | return out; |
| 70 | } | 86 | } |
| 71 | 87 | ||
| 72 | static inline timestamp cpu_to_lets(kernel_timestamp in) | 88 | static inline timestamp cpu_to_lets(kernel_timestamp in) |
| 73 | { | 89 | { |
| 74 | timestamp out; | 90 | timestamp out; |
| 91 | |||
| 75 | memcpy(&out, &in, sizeof(timestamp)); | 92 | memcpy(&out, &in, sizeof(timestamp)); |
| 76 | out.typeAndTimezone = cpu_to_le16(in.typeAndTimezone); | 93 | out.typeAndTimezone = cpu_to_le16(in.typeAndTimezone); |
| 77 | out.year = cpu_to_le16(in.year); | 94 | out.year = cpu_to_le16(in.year); |
| 95 | |||
| 78 | return out; | 96 | return out; |
| 79 | } | 97 | } |
| 80 | 98 | ||
| 81 | #endif /* __UDF_ENDIAN_H */ | 99 | #endif /* __UDF_ENDIAN_H */ |
diff --git a/fs/udf/udftime.c b/fs/udf/udftime.c index b9f3198080e9..3fd80eb66af3 100644 --- a/fs/udf/udftime.c +++ b/fs/udf/udftime.c | |||
| @@ -18,18 +18,18 @@ | |||
| 18 | Boston, MA 02111-1307, USA. */ | 18 | Boston, MA 02111-1307, USA. */ |
| 19 | 19 | ||
| 20 | /* | 20 | /* |
| 21 | * dgb 10/02/98: ripped this from glibc source to help convert timestamps to unix time | 21 | * dgb 10/02/98: ripped this from glibc source to help convert timestamps to unix time |
| 22 | * 10/04/98: added new table-based lookup after seeing how ugly the gnu code is | 22 | * 10/04/98: added new table-based lookup after seeing how ugly the gnu code is |
| 23 | * blf 09/27/99: ripped out all the old code and inserted new table from | 23 | * blf 09/27/99: ripped out all the old code and inserted new table from |
| 24 | * John Brockmeyer (without leap second corrections) | 24 | * John Brockmeyer (without leap second corrections) |
| 25 | * rewrote udf_stamp_to_time and fixed timezone accounting in | 25 | * rewrote udf_stamp_to_time and fixed timezone accounting in |
| 26 | udf_time_to_stamp. | 26 | * udf_time_to_stamp. |
| 27 | */ | 27 | */ |
| 28 | 28 | ||
| 29 | /* | 29 | /* |
| 30 | * We don't take into account leap seconds. This may be correct or incorrect. | 30 | * We don't take into account leap seconds. This may be correct or incorrect. |
| 31 | * For more NIST information (especially dealing with leap seconds), see: | 31 | * For more NIST information (especially dealing with leap seconds), see: |
| 32 | * http://www.boulder.nist.gov/timefreq/pubs/bulletin/leapsecond.htm | 32 | * http://www.boulder.nist.gov/timefreq/pubs/bulletin/leapsecond.htm |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | #include <linux/types.h> | 35 | #include <linux/types.h> |
| @@ -54,28 +54,28 @@ static const unsigned short int __mon_yday[2][13] = { | |||
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | #define MAX_YEAR_SECONDS 69 | 56 | #define MAX_YEAR_SECONDS 69 |
| 57 | #define SPD 0x15180 /*3600*24 */ | 57 | #define SPD 0x15180 /*3600*24 */ |
| 58 | #define SPY(y,l,s) (SPD * (365*y+l)+s) | 58 | #define SPY(y,l,s) (SPD * (365*y+l)+s) |
| 59 | 59 | ||
| 60 | static time_t year_seconds[MAX_YEAR_SECONDS] = { | 60 | static time_t year_seconds[MAX_YEAR_SECONDS]= { |
| 61 | /*1970*/ SPY(0, 0, 0), SPY(1, 0, 0), SPY(2, 0, 0), SPY(3, 1, 0), | 61 | /*1970*/ SPY( 0, 0,0), SPY( 1, 0,0), SPY( 2, 0,0), SPY( 3, 1,0), |
| 62 | /*1974*/ SPY(4, 1, 0), SPY(5, 1, 0), SPY(6, 1, 0), SPY(7, 2, 0), | 62 | /*1974*/ SPY( 4, 1,0), SPY( 5, 1,0), SPY( 6, 1,0), SPY( 7, 2,0), |
| 63 | /*1978*/ SPY(8, 2, 0), SPY(9, 2, 0), SPY(10, 2, 0), SPY(11, 3, 0), | 63 | /*1978*/ SPY( 8, 2,0), SPY( 9, 2,0), SPY(10, 2,0), SPY(11, 3,0), |
| 64 | /*1982*/ SPY(12, 3, 0), SPY(13, 3, 0), SPY(14, 3, 0), SPY(15, 4, 0), | 64 | /*1982*/ SPY(12, 3,0), SPY(13, 3,0), SPY(14, 3,0), SPY(15, 4,0), |
| 65 | /*1986*/ SPY(16, 4, 0), SPY(17, 4, 0), SPY(18, 4, 0), SPY(19, 5, 0), | 65 | /*1986*/ SPY(16, 4,0), SPY(17, 4,0), SPY(18, 4,0), SPY(19, 5,0), |
| 66 | /*1990*/ SPY(20, 5, 0), SPY(21, 5, 0), SPY(22, 5, 0), SPY(23, 6, 0), | 66 | /*1990*/ SPY(20, 5,0), SPY(21, 5,0), SPY(22, 5,0), SPY(23, 6,0), |
| 67 | /*1994*/ SPY(24, 6, 0), SPY(25, 6, 0), SPY(26, 6, 0), SPY(27, 7, 0), | 67 | /*1994*/ SPY(24, 6,0), SPY(25, 6,0), SPY(26, 6,0), SPY(27, 7,0), |
| 68 | /*1998*/ SPY(28, 7, 0), SPY(29, 7, 0), SPY(30, 7, 0), SPY(31, 8, 0), | 68 | /*1998*/ SPY(28, 7,0), SPY(29, 7,0), SPY(30, 7,0), SPY(31, 8,0), |
| 69 | /*2002*/ SPY(32, 8, 0), SPY(33, 8, 0), SPY(34, 8, 0), SPY(35, 9, 0), | 69 | /*2002*/ SPY(32, 8,0), SPY(33, 8,0), SPY(34, 8,0), SPY(35, 9,0), |
| 70 | /*2006*/ SPY(36, 9, 0), SPY(37, 9, 0), SPY(38, 9, 0), SPY(39, 10, 0), | 70 | /*2006*/ SPY(36, 9,0), SPY(37, 9,0), SPY(38, 9,0), SPY(39,10,0), |
| 71 | /*2010*/ SPY(40, 10, 0), SPY(41, 10, 0), SPY(42, 10, 0), SPY(43, 11, 0), | 71 | /*2010*/ SPY(40,10,0), SPY(41,10,0), SPY(42,10,0), SPY(43,11,0), |
| 72 | /*2014*/ SPY(44, 11, 0), SPY(45, 11, 0), SPY(46, 11, 0), SPY(47, 12, 0), | 72 | /*2014*/ SPY(44,11,0), SPY(45,11,0), SPY(46,11,0), SPY(47,12,0), |
| 73 | /*2018*/ SPY(48, 12, 0), SPY(49, 12, 0), SPY(50, 12, 0), SPY(51, 13, 0), | 73 | /*2018*/ SPY(48,12,0), SPY(49,12,0), SPY(50,12,0), SPY(51,13,0), |
| 74 | /*2022*/ SPY(52, 13, 0), SPY(53, 13, 0), SPY(54, 13, 0), SPY(55, 14, 0), | 74 | /*2022*/ SPY(52,13,0), SPY(53,13,0), SPY(54,13,0), SPY(55,14,0), |
| 75 | /*2026*/ SPY(56, 14, 0), SPY(57, 14, 0), SPY(58, 14, 0), SPY(59, 15, 0), | 75 | /*2026*/ SPY(56,14,0), SPY(57,14,0), SPY(58,14,0), SPY(59,15,0), |
| 76 | /*2030*/ SPY(60, 15, 0), SPY(61, 15, 0), SPY(62, 15, 0), SPY(63, 16, 0), | 76 | /*2030*/ SPY(60,15,0), SPY(61,15,0), SPY(62,15,0), SPY(63,16,0), |
| 77 | /*2034*/ SPY(64, 16, 0), SPY(65, 16, 0), SPY(66, 16, 0), SPY(67, 17, 0), | 77 | /*2034*/ SPY(64,16,0), SPY(65,16,0), SPY(66,16,0), SPY(67,17,0), |
| 78 | /*2038*/ SPY(68, 17, 0) | 78 | /*2038*/ SPY(68,17,0) |
| 79 | }; | 79 | }; |
| 80 | 80 | ||
| 81 | extern struct timezone sys_tz; | 81 | extern struct timezone sys_tz; |
| @@ -83,7 +83,7 @@ extern struct timezone sys_tz; | |||
| 83 | #define SECS_PER_HOUR (60 * 60) | 83 | #define SECS_PER_HOUR (60 * 60) |
| 84 | #define SECS_PER_DAY (SECS_PER_HOUR * 24) | 84 | #define SECS_PER_DAY (SECS_PER_HOUR * 24) |
| 85 | 85 | ||
| 86 | time_t *udf_stamp_to_time(time_t * dest, long *dest_usec, kernel_timestamp src) | 86 | time_t *udf_stamp_to_time(time_t *dest, long *dest_usec, kernel_timestamp src) |
| 87 | { | 87 | { |
| 88 | int yday; | 88 | int yday; |
| 89 | uint8_t type = src.typeAndTimezone >> 12; | 89 | uint8_t type = src.typeAndTimezone >> 12; |
| @@ -93,10 +93,11 @@ time_t *udf_stamp_to_time(time_t * dest, long *dest_usec, kernel_timestamp src) | |||
| 93 | offset = src.typeAndTimezone << 4; | 93 | offset = src.typeAndTimezone << 4; |
| 94 | /* sign extent offset */ | 94 | /* sign extent offset */ |
| 95 | offset = (offset >> 4); | 95 | offset = (offset >> 4); |
| 96 | if (offset == -2047) /* unspecified offset */ | 96 | if (offset == -2047) /* unspecified offset */ |
| 97 | offset = 0; | 97 | offset = 0; |
| 98 | } else | 98 | } else { |
| 99 | offset = 0; | 99 | offset = 0; |
| 100 | } | ||
| 100 | 101 | ||
| 101 | if ((src.year < EPOCH_YEAR) || | 102 | if ((src.year < EPOCH_YEAR) || |
| 102 | (src.year >= EPOCH_YEAR + MAX_YEAR_SECONDS)) { | 103 | (src.year >= EPOCH_YEAR + MAX_YEAR_SECONDS)) { |
| @@ -107,12 +108,10 @@ time_t *udf_stamp_to_time(time_t * dest, long *dest_usec, kernel_timestamp src) | |||
| 107 | *dest = year_seconds[src.year - EPOCH_YEAR]; | 108 | *dest = year_seconds[src.year - EPOCH_YEAR]; |
| 108 | *dest -= offset * 60; | 109 | *dest -= offset * 60; |
| 109 | 110 | ||
| 110 | yday = ((__mon_yday[__isleap(src.year)] | 111 | yday = ((__mon_yday[__isleap (src.year)] |
| 111 | [src.month - 1]) + (src.day - 1)); | 112 | [src.month - 1]) + (src.day - 1)); |
| 112 | *dest += (((yday * 24) + src.hour) * 60 + src.minute) * 60 + src.second; | 113 | *dest += ( ( (yday * 24) + src.hour ) * 60 + src.minute ) * 60 + src.second; |
| 113 | *dest_usec = | 114 | *dest_usec = src.centiseconds * 10000 + src.hundredsOfMicroseconds * 100 + src.microseconds; |
| 114 | src.centiseconds * 10000 + src.hundredsOfMicroseconds * 100 + | ||
| 115 | src.microseconds; | ||
| 116 | return dest; | 115 | return dest; |
| 117 | } | 116 | } |
| 118 | 117 | ||
| @@ -145,8 +144,9 @@ kernel_timestamp *udf_time_to_stamp(kernel_timestamp * dest, struct timespec ts) | |||
| 145 | long int yg = y + days / 365 - (days % 365 < 0); | 144 | long int yg = y + days / 365 - (days % 365 < 0); |
| 146 | 145 | ||
| 147 | /* Adjust DAYS and Y to match the guessed year. */ | 146 | /* Adjust DAYS and Y to match the guessed year. */ |
| 148 | days -= ((yg - y) * 365 + LEAPS_THRU_END_OF(yg - 1) | 147 | days -= ((yg - y) * 365 |
| 149 | - LEAPS_THRU_END_OF(y - 1)); | 148 | + LEAPS_THRU_END_OF (yg - 1) |
| 149 | - LEAPS_THRU_END_OF (y - 1)); | ||
| 150 | y = yg; | 150 | y = yg; |
| 151 | } | 151 | } |
| 152 | dest->year = y; | 152 | dest->year = y; |
| @@ -158,11 +158,9 @@ kernel_timestamp *udf_time_to_stamp(kernel_timestamp * dest, struct timespec ts) | |||
| 158 | dest->day = days + 1; | 158 | dest->day = days + 1; |
| 159 | 159 | ||
| 160 | dest->centiseconds = ts.tv_nsec / 10000000; | 160 | dest->centiseconds = ts.tv_nsec / 10000000; |
| 161 | dest->hundredsOfMicroseconds = | 161 | dest->hundredsOfMicroseconds = (ts.tv_nsec / 1000 - dest->centiseconds * 10000) / 100; |
| 162 | (ts.tv_nsec / 1000 - dest->centiseconds * 10000) / 100; | 162 | dest->microseconds = (ts.tv_nsec / 1000 - dest->centiseconds * 10000 - |
| 163 | dest->microseconds = | 163 | dest->hundredsOfMicroseconds * 100); |
| 164 | (ts.tv_nsec / 1000 - dest->centiseconds * 10000 - | ||
| 165 | dest->hundredsOfMicroseconds * 100); | ||
| 166 | return dest; | 164 | return dest; |
| 167 | } | 165 | } |
| 168 | 166 | ||
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c index 46835240275c..9e6099c26c27 100644 --- a/fs/udf/unicode.c +++ b/fs/udf/unicode.c | |||
| @@ -29,21 +29,23 @@ | |||
| 29 | 29 | ||
| 30 | static int udf_translate_to_linux(uint8_t *, uint8_t *, int, uint8_t *, int); | 30 | static int udf_translate_to_linux(uint8_t *, uint8_t *, int, uint8_t *, int); |
| 31 | 31 | ||
| 32 | static int udf_char_to_ustr(struct ustr *dest, const uint8_t * src, int strlen) | 32 | static int udf_char_to_ustr(struct ustr *dest, const uint8_t *src, int strlen) |
| 33 | { | 33 | { |
| 34 | if ((!dest) || (!src) || (!strlen) || (strlen > UDF_NAME_LEN - 2)) | 34 | if ((!dest) || (!src) || (!strlen) || (strlen > UDF_NAME_LEN - 2)) |
| 35 | return 0; | 35 | return 0; |
| 36 | |||
| 36 | memset(dest, 0, sizeof(struct ustr)); | 37 | memset(dest, 0, sizeof(struct ustr)); |
| 37 | memcpy(dest->u_name, src, strlen); | 38 | memcpy(dest->u_name, src, strlen); |
| 38 | dest->u_cmpID = 0x08; | 39 | dest->u_cmpID = 0x08; |
| 39 | dest->u_len = strlen; | 40 | dest->u_len = strlen; |
| 41 | |||
| 40 | return strlen; | 42 | return strlen; |
| 41 | } | 43 | } |
| 42 | 44 | ||
| 43 | /* | 45 | /* |
| 44 | * udf_build_ustr | 46 | * udf_build_ustr |
| 45 | */ | 47 | */ |
| 46 | int udf_build_ustr(struct ustr *dest, dstring * ptr, int size) | 48 | int udf_build_ustr(struct ustr *dest, dstring *ptr, int size) |
| 47 | { | 49 | { |
| 48 | int usesize; | 50 | int usesize; |
| 49 | 51 | ||
| @@ -55,13 +57,14 @@ int udf_build_ustr(struct ustr *dest, dstring * ptr, int size) | |||
| 55 | dest->u_cmpID = ptr[0]; | 57 | dest->u_cmpID = ptr[0]; |
| 56 | dest->u_len = ptr[size - 1]; | 58 | dest->u_len = ptr[size - 1]; |
| 57 | memcpy(dest->u_name, ptr + 1, usesize - 1); | 59 | memcpy(dest->u_name, ptr + 1, usesize - 1); |
| 60 | |||
| 58 | return 0; | 61 | return 0; |
| 59 | } | 62 | } |
| 60 | 63 | ||
| 61 | /* | 64 | /* |
| 62 | * udf_build_ustr_exact | 65 | * udf_build_ustr_exact |
| 63 | */ | 66 | */ |
| 64 | static int udf_build_ustr_exact(struct ustr *dest, dstring * ptr, int exactsize) | 67 | static int udf_build_ustr_exact(struct ustr *dest, dstring *ptr, int exactsize) |
| 65 | { | 68 | { |
| 66 | if ((!dest) || (!ptr) || (!exactsize)) | 69 | if ((!dest) || (!ptr) || (!exactsize)) |
| 67 | return -1; | 70 | return -1; |
| @@ -70,6 +73,7 @@ static int udf_build_ustr_exact(struct ustr *dest, dstring * ptr, int exactsize) | |||
| 70 | dest->u_cmpID = ptr[0]; | 73 | dest->u_cmpID = ptr[0]; |
| 71 | dest->u_len = exactsize - 1; | 74 | dest->u_len = exactsize - 1; |
| 72 | memcpy(dest->u_name, ptr + 1, exactsize - 1); | 75 | memcpy(dest->u_name, ptr + 1, exactsize - 1); |
| 76 | |||
| 73 | return 0; | 77 | return 0; |
| 74 | } | 78 | } |
| 75 | 79 | ||
| @@ -129,20 +133,15 @@ int udf_CS0toUTF8(struct ustr *utf_o, struct ustr *ocu_i) | |||
| 129 | c = (c << 8) | ocu[i++]; | 133 | c = (c << 8) | ocu[i++]; |
| 130 | 134 | ||
| 131 | /* Compress Unicode to UTF-8 */ | 135 | /* Compress Unicode to UTF-8 */ |
| 132 | if (c < 0x80U) | 136 | if (c < 0x80U) { |
| 133 | utf_o->u_name[utf_o->u_len++] = (uint8_t) c; | 137 | utf_o->u_name[utf_o->u_len++] = (uint8_t)c; |
| 134 | else if (c < 0x800U) { | 138 | } else if (c < 0x800U) { |
| 135 | utf_o->u_name[utf_o->u_len++] = | 139 | utf_o->u_name[utf_o->u_len++] = (uint8_t)(0xc0 | (c >> 6)); |
| 136 | (uint8_t) (0xc0 | (c >> 6)); | 140 | utf_o->u_name[utf_o->u_len++] = (uint8_t)(0x80 | (c & 0x3f)); |
| 137 | utf_o->u_name[utf_o->u_len++] = | ||
| 138 | (uint8_t) (0x80 | (c & 0x3f)); | ||
| 139 | } else { | 141 | } else { |
| 140 | utf_o->u_name[utf_o->u_len++] = | 142 | utf_o->u_name[utf_o->u_len++] = (uint8_t)(0xe0 | (c >> 12)); |
| 141 | (uint8_t) (0xe0 | (c >> 12)); | 143 | utf_o->u_name[utf_o->u_len++] = (uint8_t)(0x80 | ((c >> 6) & 0x3f)); |
| 142 | utf_o->u_name[utf_o->u_len++] = | 144 | utf_o->u_name[utf_o->u_len++] = (uint8_t)(0x80 | (c & 0x3f)); |
| 143 | (uint8_t) (0x80 | ((c >> 6) & 0x3f)); | ||
| 144 | utf_o->u_name[utf_o->u_len++] = | ||
| 145 | (uint8_t) (0x80 | (c & 0x3f)); | ||
| 146 | } | 145 | } |
| 147 | } | 146 | } |
| 148 | utf_o->u_cmpID = 8; | 147 | utf_o->u_cmpID = 8; |
| @@ -173,7 +172,7 @@ int udf_CS0toUTF8(struct ustr *utf_o, struct ustr *ocu_i) | |||
| 173 | * November 12, 1997 - Andrew E. Mileski | 172 | * November 12, 1997 - Andrew E. Mileski |
| 174 | * Written, tested, and released. | 173 | * Written, tested, and released. |
| 175 | */ | 174 | */ |
| 176 | static int udf_UTF8toCS0(dstring * ocu, struct ustr *utf, int length) | 175 | static int udf_UTF8toCS0(dstring *ocu, struct ustr *utf, int length) |
| 177 | { | 176 | { |
| 178 | unsigned c, i, max_val, utf_char; | 177 | unsigned c, i, max_val, utf_char; |
| 179 | int utf_cnt, u_len; | 178 | int utf_cnt, u_len; |
| @@ -182,12 +181,12 @@ static int udf_UTF8toCS0(dstring * ocu, struct ustr *utf, int length) | |||
| 182 | ocu[0] = 8; | 181 | ocu[0] = 8; |
| 183 | max_val = 0xffU; | 182 | max_val = 0xffU; |
| 184 | 183 | ||
| 185 | try_again: | 184 | try_again: |
| 186 | u_len = 0U; | 185 | u_len = 0U; |
| 187 | utf_char = 0U; | 186 | utf_char = 0U; |
| 188 | utf_cnt = 0U; | 187 | utf_cnt = 0U; |
| 189 | for (i = 0U; i < utf->u_len; i++) { | 188 | for (i = 0U; i < utf->u_len; i++) { |
| 190 | c = (uint8_t) utf->u_name[i]; | 189 | c = (uint8_t)utf->u_name[i]; |
| 191 | 190 | ||
| 192 | /* Complete a multi-byte UTF-8 character */ | 191 | /* Complete a multi-byte UTF-8 character */ |
| 193 | if (utf_cnt) { | 192 | if (utf_cnt) { |
| @@ -213,37 +212,40 @@ static int udf_UTF8toCS0(dstring * ocu, struct ustr *utf, int length) | |||
| 213 | } else if ((c & 0xfeU) == 0xfcU) { | 212 | } else if ((c & 0xfeU) == 0xfcU) { |
| 214 | utf_char = c & 0x01U; | 213 | utf_char = c & 0x01U; |
| 215 | utf_cnt = 5; | 214 | utf_cnt = 5; |
| 216 | } else | 215 | } else { |
| 217 | goto error_out; | 216 | goto error_out; |
| 217 | } | ||
| 218 | continue; | 218 | continue; |
| 219 | } else | 219 | } else { |
| 220 | /* Single byte UTF-8 character (most common) */ | 220 | /* Single byte UTF-8 character (most common) */ |
| 221 | utf_char = c; | 221 | utf_char = c; |
| 222 | } | ||
| 222 | } | 223 | } |
| 223 | 224 | ||
| 224 | /* Choose no compression if necessary */ | 225 | /* Choose no compression if necessary */ |
| 225 | if (utf_char > max_val) { | 226 | if (utf_char > max_val) { |
| 226 | if (0xffU == max_val) { | 227 | if (max_val == 0xffU) { |
| 227 | max_val = 0xffffU; | 228 | max_val = 0xffffU; |
| 228 | ocu[0] = (uint8_t) 0x10U; | 229 | ocu[0] = (uint8_t)0x10U; |
| 229 | goto try_again; | 230 | goto try_again; |
| 230 | } | 231 | } |
| 231 | goto error_out; | 232 | goto error_out; |
| 232 | } | 233 | } |
| 233 | 234 | ||
| 234 | if (max_val == 0xffffU) { | 235 | if (max_val == 0xffffU) { |
| 235 | ocu[++u_len] = (uint8_t) (utf_char >> 8); | 236 | ocu[++u_len] = (uint8_t)(utf_char >> 8); |
| 236 | } | 237 | } |
| 237 | ocu[++u_len] = (uint8_t) (utf_char & 0xffU); | 238 | ocu[++u_len] = (uint8_t)(utf_char & 0xffU); |
| 238 | } | 239 | } |
| 239 | 240 | ||
| 240 | if (utf_cnt) { | 241 | if (utf_cnt) { |
| 241 | error_out: | 242 | error_out: |
| 242 | ocu[++u_len] = '?'; | 243 | ocu[++u_len] = '?'; |
| 243 | printk(KERN_DEBUG "udf: bad UTF-8 character\n"); | 244 | printk(KERN_DEBUG "udf: bad UTF-8 character\n"); |
| 244 | } | 245 | } |
| 245 | 246 | ||
| 246 | ocu[length - 1] = (uint8_t) u_len + 1; | 247 | ocu[length - 1] = (uint8_t)u_len + 1; |
| 248 | |||
| 247 | return u_len + 1; | 249 | return u_len + 1; |
| 248 | } | 250 | } |
| 249 | 251 | ||
| @@ -288,7 +290,7 @@ static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o, | |||
| 288 | return utf_o->u_len; | 290 | return utf_o->u_len; |
| 289 | } | 291 | } |
| 290 | 292 | ||
| 291 | static int udf_NLStoCS0(struct nls_table *nls, dstring * ocu, struct ustr *uni, | 293 | static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni, |
| 292 | int length) | 294 | int length) |
| 293 | { | 295 | { |
| 294 | unsigned len, i, max_val; | 296 | unsigned len, i, max_val; |
| @@ -299,7 +301,7 @@ static int udf_NLStoCS0(struct nls_table *nls, dstring * ocu, struct ustr *uni, | |||
| 299 | ocu[0] = 8; | 301 | ocu[0] = 8; |
| 300 | max_val = 0xffU; | 302 | max_val = 0xffU; |
| 301 | 303 | ||
| 302 | try_again: | 304 | try_again: |
| 303 | u_len = 0U; | 305 | u_len = 0U; |
| 304 | for (i = 0U; i < uni->u_len; i++) { | 306 | for (i = 0U; i < uni->u_len; i++) { |
| 305 | len = nls->char2uni(&uni->u_name[i], uni->u_len - i, &uni_char); | 307 | len = nls->char2uni(&uni->u_name[i], uni->u_len - i, &uni_char); |
| @@ -308,21 +310,21 @@ static int udf_NLStoCS0(struct nls_table *nls, dstring * ocu, struct ustr *uni, | |||
| 308 | 310 | ||
| 309 | if (uni_char > max_val) { | 311 | if (uni_char > max_val) { |
| 310 | max_val = 0xffffU; | 312 | max_val = 0xffffU; |
| 311 | ocu[0] = (uint8_t) 0x10U; | 313 | ocu[0] = (uint8_t)0x10U; |
| 312 | goto try_again; | 314 | goto try_again; |
| 313 | } | 315 | } |
| 314 | 316 | ||
| 315 | if (max_val == 0xffffU) | 317 | if (max_val == 0xffffU) |
| 316 | ocu[++u_len] = (uint8_t) (uni_char >> 8); | 318 | ocu[++u_len] = (uint8_t)(uni_char >> 8); |
| 317 | ocu[++u_len] = (uint8_t) (uni_char & 0xffU); | 319 | ocu[++u_len] = (uint8_t)(uni_char & 0xffU); |
| 318 | i += len - 1; | 320 | i += len - 1; |
| 319 | } | 321 | } |
| 320 | 322 | ||
| 321 | ocu[length - 1] = (uint8_t) u_len + 1; | 323 | ocu[length - 1] = (uint8_t)u_len + 1; |
| 322 | return u_len + 1; | 324 | return u_len + 1; |
| 323 | } | 325 | } |
| 324 | 326 | ||
| 325 | int udf_get_filename(struct super_block *sb, uint8_t * sname, uint8_t * dname, | 327 | int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, |
| 326 | int flen) | 328 | int flen) |
| 327 | { | 329 | { |
| 328 | struct ustr filename, unifilename; | 330 | struct ustr filename, unifilename; |
| @@ -334,30 +336,29 @@ int udf_get_filename(struct super_block *sb, uint8_t * sname, uint8_t * dname, | |||
| 334 | 336 | ||
| 335 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { | 337 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { |
| 336 | if (!udf_CS0toUTF8(&filename, &unifilename)) { | 338 | if (!udf_CS0toUTF8(&filename, &unifilename)) { |
| 337 | udf_debug("Failed in udf_get_filename: sname = %s\n", | 339 | udf_debug("Failed in udf_get_filename: sname = %s\n", sname); |
| 338 | sname); | ||
| 339 | return 0; | 340 | return 0; |
| 340 | } | 341 | } |
| 341 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { | 342 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { |
| 342 | if (!udf_CS0toNLS | 343 | if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, &filename, &unifilename)) { |
| 343 | (UDF_SB(sb)->s_nls_map, &filename, &unifilename)) { | 344 | udf_debug("Failed in udf_get_filename: sname = %s\n", sname); |
| 344 | udf_debug("Failed in udf_get_filename: sname = %s\n", | ||
| 345 | sname); | ||
| 346 | return 0; | 345 | return 0; |
| 347 | } | 346 | } |
| 348 | } else | 347 | } else { |
| 349 | return 0; | 348 | return 0; |
| 349 | } | ||
| 350 | 350 | ||
| 351 | if ((len = | 351 | len = udf_translate_to_linux(dname, filename.u_name, filename.u_len, |
| 352 | udf_translate_to_linux(dname, filename.u_name, filename.u_len, | 352 | unifilename.u_name, unifilename.u_len); |
| 353 | unifilename.u_name, unifilename.u_len))) { | 353 | if (len) { |
| 354 | return len; | 354 | return len; |
| 355 | } | 355 | } |
| 356 | |||
| 356 | return 0; | 357 | return 0; |
| 357 | } | 358 | } |
| 358 | 359 | ||
| 359 | int udf_put_filename(struct super_block *sb, const uint8_t * sname, | 360 | int udf_put_filename(struct super_block *sb, const uint8_t *sname, |
| 360 | uint8_t * dname, int flen) | 361 | uint8_t *dname, int flen) |
| 361 | { | 362 | { |
| 362 | struct ustr unifilename; | 363 | struct ustr unifilename; |
| 363 | int namelen; | 364 | int namelen; |
| @@ -367,31 +368,29 @@ int udf_put_filename(struct super_block *sb, const uint8_t * sname, | |||
| 367 | } | 368 | } |
| 368 | 369 | ||
| 369 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { | 370 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { |
| 370 | if (! | 371 | namelen = udf_UTF8toCS0(dname, &unifilename, UDF_NAME_LEN); |
| 371 | (namelen = | 372 | if (!namelen) { |
| 372 | udf_UTF8toCS0(dname, &unifilename, UDF_NAME_LEN))) { | ||
| 373 | return 0; | 373 | return 0; |
| 374 | } | 374 | } |
| 375 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { | 375 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { |
| 376 | if (! | 376 | namelen = udf_NLStoCS0(UDF_SB(sb)->s_nls_map, dname, &unifilename, UDF_NAME_LEN); |
| 377 | (namelen = | 377 | if (!namelen) { |
| 378 | udf_NLStoCS0(UDF_SB(sb)->s_nls_map, dname, &unifilename, | ||
| 379 | UDF_NAME_LEN))) { | ||
| 380 | return 0; | 378 | return 0; |
| 381 | } | 379 | } |
| 382 | } else | 380 | } else { |
| 383 | return 0; | 381 | return 0; |
| 382 | } | ||
| 384 | 383 | ||
| 385 | return namelen; | 384 | return namelen; |
| 386 | } | 385 | } |
| 387 | 386 | ||
| 388 | #define ILLEGAL_CHAR_MARK '_' | 387 | #define ILLEGAL_CHAR_MARK '_' |
| 389 | #define EXT_MARK '.' | 388 | #define EXT_MARK '.' |
| 390 | #define CRC_MARK '#' | 389 | #define CRC_MARK '#' |
| 391 | #define EXT_SIZE 5 | 390 | #define EXT_SIZE 5 |
| 392 | 391 | ||
| 393 | static int udf_translate_to_linux(uint8_t * newName, uint8_t * udfName, | 392 | static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName, int udfLen, |
| 394 | int udfLen, uint8_t * fidName, int fidNameLen) | 393 | uint8_t *fidName, int fidNameLen) |
| 395 | { | 394 | { |
| 396 | int index, newIndex = 0, needsCRC = 0; | 395 | int index, newIndex = 0, needsCRC = 0; |
| 397 | int extIndex = 0, newExtIndex = 0, hasExt = 0; | 396 | int extIndex = 0, newExtIndex = 0, hasExt = 0; |
| @@ -399,8 +398,8 @@ static int udf_translate_to_linux(uint8_t * newName, uint8_t * udfName, | |||
| 399 | uint8_t curr; | 398 | uint8_t curr; |
| 400 | const uint8_t hexChar[] = "0123456789ABCDEF"; | 399 | const uint8_t hexChar[] = "0123456789ABCDEF"; |
| 401 | 400 | ||
| 402 | if (udfName[0] == '.' && (udfLen == 1 || | 401 | if (udfName[0] == '.' && |
| 403 | (udfLen == 2 && udfName[1] == '.'))) { | 402 | (udfLen == 1 || (udfLen == 2 && udfName[1] == '.'))) { |
| 404 | needsCRC = 1; | 403 | needsCRC = 1; |
| 405 | newIndex = udfLen; | 404 | newIndex = udfLen; |
| 406 | memcpy(newName, udfName, udfLen); | 405 | memcpy(newName, udfName, udfLen); |
| @@ -410,16 +409,13 @@ static int udf_translate_to_linux(uint8_t * newName, uint8_t * udfName, | |||
| 410 | if (curr == '/' || curr == 0) { | 409 | if (curr == '/' || curr == 0) { |
| 411 | needsCRC = 1; | 410 | needsCRC = 1; |
| 412 | curr = ILLEGAL_CHAR_MARK; | 411 | curr = ILLEGAL_CHAR_MARK; |
| 413 | while (index + 1 < udfLen | 412 | while (index + 1 < udfLen && (udfName[index + 1] == '/' || |
| 414 | && (udfName[index + 1] == '/' | 413 | udfName[index + 1] == 0)) |
| 415 | || udfName[index + 1] == 0)) | ||
| 416 | index++; | 414 | index++; |
| 417 | } | 415 | } if (curr == EXT_MARK && (udfLen - index - 1) <= EXT_SIZE) { |
| 418 | if (curr == EXT_MARK | 416 | if (udfLen == index + 1) { |
| 419 | && (udfLen - index - 1) <= EXT_SIZE) { | ||
| 420 | if (udfLen == index + 1) | ||
| 421 | hasExt = 0; | 417 | hasExt = 0; |
| 422 | else { | 418 | } else { |
| 423 | hasExt = 1; | 419 | hasExt = 1; |
| 424 | extIndex = index; | 420 | extIndex = index; |
| 425 | newExtIndex = newIndex; | 421 | newExtIndex = newIndex; |
| @@ -437,23 +433,16 @@ static int udf_translate_to_linux(uint8_t * newName, uint8_t * udfName, | |||
| 437 | 433 | ||
| 438 | if (hasExt) { | 434 | if (hasExt) { |
| 439 | int maxFilenameLen; | 435 | int maxFilenameLen; |
| 440 | for (index = 0; | 436 | for(index = 0; index < EXT_SIZE && extIndex + index + 1 < udfLen; index++) { |
| 441 | index < EXT_SIZE && extIndex + index + 1 < udfLen; | ||
| 442 | index++) { | ||
| 443 | curr = udfName[extIndex + index + 1]; | 437 | curr = udfName[extIndex + index + 1]; |
| 444 | 438 | ||
| 445 | if (curr == '/' || curr == 0) { | 439 | if (curr == '/' || curr == 0) { |
| 446 | needsCRC = 1; | 440 | needsCRC = 1; |
| 447 | curr = ILLEGAL_CHAR_MARK; | 441 | curr = ILLEGAL_CHAR_MARK; |
| 448 | while (extIndex + index + 2 < udfLen | 442 | while(extIndex + index + 2 < udfLen && |
| 449 | && (index + 1 < EXT_SIZE | 443 | (index + 1 < EXT_SIZE |
| 450 | && | 444 | && (udfName[extIndex + index + 2] == '/' || |
| 451 | (udfName | 445 | udfName[extIndex + index + 2] == 0))) |
| 452 | [extIndex + index + 2] == | ||
| 453 | '/' | ||
| 454 | || udfName[extIndex + | ||
| 455 | index + 2] == | ||
| 456 | 0))) | ||
| 457 | index++; | 446 | index++; |
| 458 | } | 447 | } |
| 459 | ext[localExtIndex++] = curr; | 448 | ext[localExtIndex++] = curr; |
| @@ -463,8 +452,9 @@ static int udf_translate_to_linux(uint8_t * newName, uint8_t * udfName, | |||
| 463 | newIndex = maxFilenameLen; | 452 | newIndex = maxFilenameLen; |
| 464 | else | 453 | else |
| 465 | newIndex = newExtIndex; | 454 | newIndex = newExtIndex; |
| 466 | } else if (newIndex > 250) | 455 | } else if (newIndex > 250) { |
| 467 | newIndex = 250; | 456 | newIndex = 250; |
| 457 | } | ||
| 468 | newName[newIndex++] = CRC_MARK; | 458 | newName[newIndex++] = CRC_MARK; |
| 469 | valueCRC = udf_crc(fidName, fidNameLen, 0); | 459 | valueCRC = udf_crc(fidName, fidNameLen, 0); |
| 470 | newName[newIndex++] = hexChar[(valueCRC & 0xf000) >> 12]; | 460 | newName[newIndex++] = hexChar[(valueCRC & 0xf000) >> 12]; |
| @@ -478,5 +468,6 @@ static int udf_translate_to_linux(uint8_t * newName, uint8_t * udfName, | |||
| 478 | newName[newIndex++] = ext[index]; | 468 | newName[newIndex++] = ext[index]; |
| 479 | } | 469 | } |
| 480 | } | 470 | } |
| 471 | |||
| 481 | return newIndex; | 472 | return newIndex; |
| 482 | } | 473 | } |
