@@ -506,37 +506,18 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c)
506
506
507
507
/* Should we copyup with O_TMPFILE or with workdir? */
508
508
if (S_ISREG (c -> stat .mode ) && ofs -> tmpfile ) {
509
- err = ovl_copy_up_start (c -> dentry );
510
- /* err < 0: interrupted, err > 0: raced with another copy-up */
511
- if (unlikely (err )) {
512
- pr_debug ("ovl_copy_up_start(%pd2) = %i\n" , c -> dentry ,
513
- err );
514
- if (err > 0 )
515
- err = 0 ;
516
- goto out_done ;
517
- }
518
509
c -> tmpfile = true;
519
- err = ovl_copy_up_locked (c );
520
- ovl_copy_up_end (c -> dentry );
521
- goto out_done ;
510
+ return ovl_copy_up_locked (c );
522
511
}
523
512
524
513
err = - EIO ;
525
514
if (lock_rename (c -> workdir , c -> upperdir ) != NULL ) {
526
515
pr_err ("overlayfs: failed to lock workdir+upperdir\n" );
527
- goto out_unlock ;
528
- }
529
- if (ovl_dentry_upper (c -> dentry )) {
530
- /* Raced with another copy-up? Nothing to do, then... */
531
- err = 0 ;
532
- goto out_unlock ;
516
+ } else {
517
+ err = ovl_copy_up_locked (c );
518
+ unlock_rename (c -> workdir , c -> upperdir );
533
519
}
534
520
535
- err = ovl_copy_up_locked (c );
536
- out_unlock :
537
- unlock_rename (c -> workdir , c -> upperdir );
538
- out_done :
539
-
540
521
return err ;
541
522
}
542
523
@@ -580,8 +561,15 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry,
580
561
}
581
562
ovl_do_check_copy_up (ctx .lowerpath .dentry );
582
563
583
- err = ovl_do_copy_up (& ctx );
584
-
564
+ err = ovl_copy_up_start (dentry );
565
+ /* err < 0: interrupted, err > 0: raced with another copy-up */
566
+ if (unlikely (err )) {
567
+ if (err > 0 )
568
+ err = 0 ;
569
+ } else {
570
+ err = ovl_do_copy_up (& ctx );
571
+ ovl_copy_up_end (dentry );
572
+ }
585
573
do_delayed_call (& done );
586
574
587
575
return err ;
0 commit comments