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 ---