namei.c (7f53b7d047d221b9fe38b9f2203bd4499135be88) | namei.c (e6d2ebddbc5205635a021a910f2f0e93bc2aa534) |
---|---|
1/* 2 * Copyright (C) 2011 Novell Inc. 3 * Copyright (C) 2016 Red Hat, Inc. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 as published by 7 * the Free Software Foundation. 8 */ --- 419 unchanged lines hidden (view full) --- 428 } 429 } 430 431 oe = ovl_alloc_entry(ctr); 432 err = -ENOMEM; 433 if (!oe) 434 goto out_put; 435 | 1/* 2 * Copyright (C) 2011 Novell Inc. 3 * Copyright (C) 2016 Red Hat, Inc. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 as published by 7 * the Free Software Foundation. 8 */ --- 419 unchanged lines hidden (view full) --- 428 } 429 } 430 431 oe = ovl_alloc_entry(ctr); 432 err = -ENOMEM; 433 if (!oe) 434 goto out_put; 435 |
436 if (upperdentry || ctr) { 437 struct dentry *realdentry; 438 struct inode *realinode; | 436 oe->opaque = upperopaque; 437 oe->impure = upperimpure; 438 oe->redirect = upperredirect; 439 oe->__upperdentry = upperdentry; 440 memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr); 441 dentry->d_fsdata = oe; |
439 | 442 |
440 realdentry = upperdentry ? upperdentry : stack[0].dentry; 441 realinode = d_inode(realdentry); 442 | 443 if (upperdentry || ctr) { |
443 err = -ENOMEM; | 444 err = -ENOMEM; |
444 if (upperdentry && !d_is_dir(upperdentry)) { 445 inode = ovl_get_inode(dentry->d_sb, realinode); 446 } else { 447 inode = ovl_new_inode(dentry->d_sb, realinode->i_mode, 448 realinode->i_rdev); 449 if (inode) 450 ovl_inode_init(inode, realinode, !!upperdentry); 451 } | 445 inode = ovl_get_inode(dentry); |
452 if (!inode) 453 goto out_free_oe; | 446 if (!inode) 447 goto out_free_oe; |
454 ovl_copyattr(realdentry->d_inode, inode); | |
455 } 456 457 revert_creds(old_cred); | 448 } 449 450 revert_creds(old_cred); |
458 oe->opaque = upperopaque; 459 oe->impure = upperimpure; 460 oe->redirect = upperredirect; 461 oe->__upperdentry = upperdentry; 462 memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr); | |
463 kfree(stack); 464 kfree(d.redirect); | 451 kfree(stack); 452 kfree(d.redirect); |
465 dentry->d_fsdata = oe; | |
466 d_add(dentry, inode); 467 468 return NULL; 469 470out_free_oe: | 453 d_add(dentry, inode); 454 455 return NULL; 456 457out_free_oe: |
458 dentry->d_fsdata = NULL; |
|
471 kfree(oe); 472out_put: 473 for (i = 0; i < ctr; i++) 474 dput(stack[i].dentry); 475 kfree(stack); 476out_put_upper: 477 dput(upperdentry); 478 kfree(upperredirect); --- 58 unchanged lines hidden --- | 459 kfree(oe); 460out_put: 461 for (i = 0; i < ctr; i++) 462 dput(stack[i].dentry); 463 kfree(stack); 464out_put_upper: 465 dput(upperdentry); 466 kfree(upperredirect); --- 58 unchanged lines hidden --- |