aboutsummaryrefslogtreecommitdiffstats
path: root/fs/overlayfs/copy_up.c
diff options
context:
space:
mode:
authorAmir Goldstein <amir73il@gmail.com>2017-05-19 08:16:21 -0400
committerMiklos Szeredi <mszeredi@redhat.com>2017-07-04 16:03:18 -0400
commit02209d10709c18d552c2494df74117db09a18e05 (patch)
tree2723eb9b74069d736e264f115b8497b8e0f6cd4a /fs/overlayfs/copy_up.c
parent7d90b853f932874f0b348858fddbd41f022179ee (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.c46
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
402static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, 402static 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
445static 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,