diff options
| author | Amir Goldstein <amir73il@gmail.com> | 2017-05-19 08:16:21 -0400 |
|---|---|---|
| committer | Miklos Szeredi <mszeredi@redhat.com> | 2017-07-04 16:03:18 -0400 |
| commit | 02209d10709c18d552c2494df74117db09a18e05 (patch) | |
| tree | 2723eb9b74069d736e264f115b8497b8e0f6cd4a /fs/overlayfs/copy_up.c | |
| parent | 7d90b853f932874f0b348858fddbd41f022179ee (diff) | |
ovl: factor out ovl_copy_up_inode() helper
Factor out helper for copying lower inode data and metadata to temp
upper inode, that is common to copy up using O_TMPFILE and workdir.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs/copy_up.c')
| -rw-r--r-- | fs/overlayfs/copy_up.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index a7941ab80c9b..81b9a44916a0 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c | |||
| @@ -399,22 +399,11 @@ temp_err: | |||
| 399 | goto out; | 399 | goto out; |
| 400 | } | 400 | } |
| 401 | 401 | ||
| 402 | static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, | 402 | static int ovl_copy_up_inode(struct dentry *dentry, struct dentry *temp, |
| 403 | struct dentry *dentry, struct path *lowerpath, | 403 | struct path *lowerpath, struct kstat *stat) |
| 404 | struct kstat *stat, const char *link, | ||
| 405 | struct kstat *pstat, bool tmpfile) | ||
| 406 | { | 404 | { |
| 407 | struct inode *wdir = workdir->d_inode; | ||
| 408 | struct inode *udir = upperdir->d_inode; | ||
| 409 | struct dentry *newdentry = NULL; | ||
| 410 | struct dentry *temp = NULL; | ||
| 411 | int err; | 405 | int err; |
| 412 | 406 | ||
| 413 | err = ovl_get_tmpfile(workdir, upperdir, dentry, stat, link, tmpfile, | ||
| 414 | &temp); | ||
| 415 | if (err) | ||
| 416 | goto out; | ||
| 417 | |||
| 418 | if (S_ISREG(stat->mode)) { | 407 | if (S_ISREG(stat->mode)) { |
| 419 | struct path upperpath; | 408 | struct path upperpath; |
| 420 | 409 | ||
| @@ -424,18 +413,18 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, | |||
| 424 | 413 | ||
| 425 | err = ovl_copy_up_data(lowerpath, &upperpath, stat->size); | 414 | err = ovl_copy_up_data(lowerpath, &upperpath, stat->size); |
| 426 | if (err) | 415 | if (err) |
| 427 | goto out_cleanup; | 416 | return err; |
| 428 | } | 417 | } |
| 429 | 418 | ||
| 430 | err = ovl_copy_xattr(lowerpath->dentry, temp); | 419 | err = ovl_copy_xattr(lowerpath->dentry, temp); |
| 431 | if (err) | 420 | if (err) |
| 432 | goto out_cleanup; | 421 | return err; |
| 433 | 422 | ||
| 434 | inode_lock(temp->d_inode); | 423 | inode_lock(temp->d_inode); |
| 435 | err = ovl_set_attr(temp, stat); | 424 | err = ovl_set_attr(temp, stat); |
| 436 | inode_unlock(temp->d_inode); | 425 | inode_unlock(temp->d_inode); |
| 437 | if (err) | 426 | if (err) |
| 438 | goto out_cleanup; | 427 | return err; |
| 439 | 428 | ||
| 440 | /* | 429 | /* |
| 441 | * Store identifier of lower inode in upper inode xattr to | 430 | * Store identifier of lower inode in upper inode xattr to |
| @@ -447,9 +436,32 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, | |||
| 447 | if (S_ISDIR(stat->mode) || stat->nlink == 1) { | 436 | if (S_ISDIR(stat->mode) || stat->nlink == 1) { |
| 448 | err = ovl_set_origin(dentry, lowerpath->dentry, temp); | 437 | err = ovl_set_origin(dentry, lowerpath->dentry, temp); |
| 449 | if (err) | 438 | if (err) |
| 450 | goto out_cleanup; | 439 | return err; |
| 451 | } | 440 | } |
| 452 | 441 | ||
| 442 | return 0; | ||
| 443 | } | ||
| 444 | |||
| 445 | static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, | ||
| 446 | struct dentry *dentry, struct path *lowerpath, | ||
| 447 | struct kstat *stat, const char *link, | ||
| 448 | struct kstat *pstat, bool tmpfile) | ||
| 449 | { | ||
| 450 | struct inode *wdir = workdir->d_inode; | ||
| 451 | struct inode *udir = upperdir->d_inode; | ||
| 452 | struct dentry *newdentry = NULL; | ||
| 453 | struct dentry *temp = NULL; | ||
| 454 | int err; | ||
| 455 | |||
| 456 | err = ovl_get_tmpfile(workdir, upperdir, dentry, stat, link, tmpfile, | ||
| 457 | &temp); | ||
| 458 | if (err) | ||
| 459 | goto out; | ||
| 460 | |||
| 461 | err = ovl_copy_up_inode(dentry, temp, lowerpath, stat); | ||
| 462 | if (err) | ||
| 463 | goto out_cleanup; | ||
| 464 | |||
| 453 | if (tmpfile) { | 465 | if (tmpfile) { |
| 454 | inode_lock_nested(udir, I_MUTEX_PARENT); | 466 | inode_lock_nested(udir, I_MUTEX_PARENT); |
| 455 | err = ovl_install_temp(workdir, upperdir, dentry, temp, pstat, | 467 | err = ovl_install_temp(workdir, upperdir, dentry, temp, pstat, |
