@@ -401,6 +401,8 @@ static int overwrite_item(struct btrfs_trans_handle *trans,
401
401
int save_old_i_size = 0 ;
402
402
unsigned long src_ptr ;
403
403
unsigned long dst_ptr ;
404
+ struct extent_buffer * dst_eb ;
405
+ int dst_slot ;
404
406
bool inode_item = key -> type == BTRFS_INODE_ITEM_KEY ;
405
407
406
408
/*
@@ -420,10 +422,13 @@ static int overwrite_item(struct btrfs_trans_handle *trans,
420
422
if (ret < 0 )
421
423
return ret ;
422
424
425
+ dst_eb = path -> nodes [0 ];
426
+ dst_slot = path -> slots [0 ];
427
+
423
428
if (ret == 0 ) {
424
429
char * src_copy ;
425
- u32 dst_size = btrfs_item_size (path -> nodes [ 0 ],
426
- path -> slots [ 0 ]);
430
+ const u32 dst_size = btrfs_item_size (dst_eb , dst_slot );
431
+
427
432
if (dst_size != item_size )
428
433
goto insert ;
429
434
@@ -438,8 +443,8 @@ static int overwrite_item(struct btrfs_trans_handle *trans,
438
443
}
439
444
440
445
read_extent_buffer (eb , src_copy , src_ptr , item_size );
441
- dst_ptr = btrfs_item_ptr_offset (path -> nodes [ 0 ], path -> slots [ 0 ] );
442
- ret = memcmp_extent_buffer (path -> nodes [ 0 ] , src_copy , dst_ptr , item_size );
446
+ dst_ptr = btrfs_item_ptr_offset (dst_eb , dst_slot );
447
+ ret = memcmp_extent_buffer (dst_eb , src_copy , dst_ptr , item_size );
443
448
444
449
kfree (src_copy );
445
450
/*
@@ -462,9 +467,9 @@ static int overwrite_item(struct btrfs_trans_handle *trans,
462
467
u64 nbytes ;
463
468
u32 mode ;
464
469
465
- item = btrfs_item_ptr (path -> nodes [ 0 ], path -> slots [ 0 ] ,
470
+ item = btrfs_item_ptr (dst_eb , dst_slot ,
466
471
struct btrfs_inode_item );
467
- nbytes = btrfs_inode_nbytes (path -> nodes [ 0 ] , item );
472
+ nbytes = btrfs_inode_nbytes (dst_eb , item );
468
473
item = btrfs_item_ptr (eb , slot ,
469
474
struct btrfs_inode_item );
470
475
btrfs_set_inode_nbytes (eb , item , nbytes );
@@ -506,20 +511,21 @@ static int overwrite_item(struct btrfs_trans_handle *trans,
506
511
key , item_size );
507
512
path -> skip_release_on_error = 0 ;
508
513
514
+ dst_eb = path -> nodes [0 ];
515
+ dst_slot = path -> slots [0 ];
516
+
509
517
/* make sure any existing item is the correct size */
510
518
if (ret == - EEXIST || ret == - EOVERFLOW ) {
511
- u32 found_size ;
512
- found_size = btrfs_item_size (path -> nodes [0 ],
513
- path -> slots [0 ]);
519
+ const u32 found_size = btrfs_item_size (dst_eb , dst_slot );
520
+
514
521
if (found_size > item_size )
515
522
btrfs_truncate_item (trans , path , item_size , 1 );
516
523
else if (found_size < item_size )
517
524
btrfs_extend_item (trans , path , item_size - found_size );
518
525
} else if (ret ) {
519
526
return ret ;
520
527
}
521
- dst_ptr = btrfs_item_ptr_offset (path -> nodes [0 ],
522
- path -> slots [0 ]);
528
+ dst_ptr = btrfs_item_ptr_offset (dst_eb , dst_slot );
523
529
524
530
/* don't overwrite an existing inode if the generation number
525
531
* was logged as zero. This is done when the tree logging code
@@ -538,7 +544,6 @@ static int overwrite_item(struct btrfs_trans_handle *trans,
538
544
dst_item = (struct btrfs_inode_item * )dst_ptr ;
539
545
540
546
if (btrfs_inode_generation (eb , src_item ) == 0 ) {
541
- struct extent_buffer * dst_eb = path -> nodes [0 ];
542
547
const u64 ino_size = btrfs_inode_size (eb , src_item );
543
548
544
549
/*
@@ -556,30 +561,28 @@ static int overwrite_item(struct btrfs_trans_handle *trans,
556
561
}
557
562
558
563
if (S_ISDIR (btrfs_inode_mode (eb , src_item )) &&
559
- S_ISDIR (btrfs_inode_mode (path -> nodes [ 0 ] , dst_item ))) {
564
+ S_ISDIR (btrfs_inode_mode (dst_eb , dst_item ))) {
560
565
save_old_i_size = 1 ;
561
- saved_i_size = btrfs_inode_size (path -> nodes [0 ],
562
- dst_item );
566
+ saved_i_size = btrfs_inode_size (dst_eb , dst_item );
563
567
}
564
568
}
565
569
566
- copy_extent_buffer (path -> nodes [0 ], eb , dst_ptr ,
567
- src_ptr , item_size );
570
+ copy_extent_buffer (dst_eb , eb , dst_ptr , src_ptr , item_size );
568
571
569
572
if (save_old_i_size ) {
570
573
struct btrfs_inode_item * dst_item ;
574
+
571
575
dst_item = (struct btrfs_inode_item * )dst_ptr ;
572
- btrfs_set_inode_size (path -> nodes [ 0 ] , dst_item , saved_i_size );
576
+ btrfs_set_inode_size (dst_eb , dst_item , saved_i_size );
573
577
}
574
578
575
579
/* make sure the generation is filled in */
576
580
if (key -> type == BTRFS_INODE_ITEM_KEY ) {
577
581
struct btrfs_inode_item * dst_item ;
582
+
578
583
dst_item = (struct btrfs_inode_item * )dst_ptr ;
579
- if (btrfs_inode_generation (path -> nodes [0 ], dst_item ) == 0 ) {
580
- btrfs_set_inode_generation (path -> nodes [0 ], dst_item ,
581
- trans -> transid );
582
- }
584
+ if (btrfs_inode_generation (dst_eb , dst_item ) == 0 )
585
+ btrfs_set_inode_generation (dst_eb , dst_item , trans -> transid );
583
586
}
584
587
no_copy :
585
588
btrfs_release_path (path );
0 commit comments