aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmir Goldstein <amir73il@gmail.com>2018-05-16 10:35:02 -0400
committerMiklos Szeredi <mszeredi@redhat.com>2018-05-31 05:06:10 -0400
commit471ec5dcf4e712ea81bf431a57c98d4b67416d30 (patch)
treed6e76dcc4899cded83e2bfce352d197fe5cfe1c0
parent6cf00764b0082cefdaf5a36202aceb1ab2470051 (diff)
ovl: struct cattr cleanups
* Rename to ovl_cattr * Fold ovl_create_real() hardlink argument into struct ovl_cattr * Create macro OVL_CATTR() to initialize struct ovl_cattr from mode Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
-rw-r--r--fs/overlayfs/copy_up.c5
-rw-r--r--fs/overlayfs/dir.c45
-rw-r--r--fs/overlayfs/overlayfs.h9
-rw-r--r--fs/overlayfs/super.c4
4 files changed, 30 insertions, 33 deletions
diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
index a8273dec0fb8..5f4c78b1bbeb 100644
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -486,7 +486,7 @@ static int ovl_get_tmpfile(struct ovl_copy_up_ctx *c, struct dentry **tempp)
486 struct dentry *temp; 486 struct dentry *temp;
487 const struct cred *old_creds = NULL; 487 const struct cred *old_creds = NULL;
488 struct cred *new_creds = NULL; 488 struct cred *new_creds = NULL;
489 struct cattr cattr = { 489 struct ovl_cattr cattr = {
490 /* Can't properly set mode on creation because of the umask */ 490 /* Can't properly set mode on creation because of the umask */
491 .mode = c->stat.mode & S_IFMT, 491 .mode = c->stat.mode & S_IFMT,
492 .rdev = c->stat.rdev, 492 .rdev = c->stat.rdev,
@@ -509,8 +509,7 @@ static int ovl_get_tmpfile(struct ovl_copy_up_ctx *c, struct dentry **tempp)
509 if (IS_ERR(temp)) 509 if (IS_ERR(temp))
510 goto temp_err; 510 goto temp_err;
511 511
512 err = ovl_create_real(d_inode(c->workdir), temp, &cattr, 512 err = ovl_create_real(d_inode(c->workdir), temp, &cattr);
513 NULL);
514 if (err) { 513 if (err) {
515 dput(temp); 514 dput(temp);
516 goto out; 515 goto out;
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index 4d431a3f7a0a..0fb3ef85f298 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -115,15 +115,15 @@ kill_whiteout:
115} 115}
116 116
117int ovl_create_real(struct inode *dir, struct dentry *newdentry, 117int ovl_create_real(struct inode *dir, struct dentry *newdentry,
118 struct cattr *attr, struct dentry *hardlink) 118 struct ovl_cattr *attr)
119{ 119{
120 int err; 120 int err;
121 121
122 if (newdentry->d_inode) 122 if (newdentry->d_inode)
123 return -ESTALE; 123 return -ESTALE;
124 124
125 if (hardlink) { 125 if (attr->hardlink) {
126 err = ovl_do_link(hardlink, dir, newdentry); 126 err = ovl_do_link(attr->hardlink, dir, newdentry);
127 } else { 127 } else {
128 switch (attr->mode & S_IFMT) { 128 switch (attr->mode & S_IFMT) {
129 case S_IFREG: 129 case S_IFREG:
@@ -213,14 +213,14 @@ static bool ovl_type_origin(struct dentry *dentry)
213} 213}
214 214
215static int ovl_create_upper(struct dentry *dentry, struct inode *inode, 215static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
216 struct cattr *attr, struct dentry *hardlink) 216 struct ovl_cattr *attr)
217{ 217{
218 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); 218 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
219 struct inode *udir = upperdir->d_inode; 219 struct inode *udir = upperdir->d_inode;
220 struct dentry *newdentry; 220 struct dentry *newdentry;
221 int err; 221 int err;
222 222
223 if (!hardlink && !IS_POSIXACL(udir)) 223 if (!attr->hardlink && !IS_POSIXACL(udir))
224 attr->mode &= ~current_umask(); 224 attr->mode &= ~current_umask();
225 225
226 inode_lock_nested(udir, I_MUTEX_PARENT); 226 inode_lock_nested(udir, I_MUTEX_PARENT);
@@ -229,7 +229,7 @@ static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
229 err = PTR_ERR(newdentry); 229 err = PTR_ERR(newdentry);
230 if (IS_ERR(newdentry)) 230 if (IS_ERR(newdentry))
231 goto out_unlock; 231 goto out_unlock;
232 err = ovl_create_real(udir, newdentry, attr, hardlink); 232 err = ovl_create_real(udir, newdentry, attr);
233 if (err) 233 if (err)
234 goto out_dput; 234 goto out_dput;
235 235
@@ -238,7 +238,7 @@ static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
238 ovl_set_opaque(dentry, newdentry); 238 ovl_set_opaque(dentry, newdentry);
239 } 239 }
240 240
241 ovl_instantiate(dentry, inode, newdentry, !!hardlink); 241 ovl_instantiate(dentry, inode, newdentry, !!attr->hardlink);
242 newdentry = NULL; 242 newdentry = NULL;
243out_dput: 243out_dput:
244 dput(newdentry); 244 dput(newdentry);
@@ -285,8 +285,7 @@ static struct dentry *ovl_clear_empty(struct dentry *dentry,
285 if (IS_ERR(opaquedir)) 285 if (IS_ERR(opaquedir))
286 goto out_unlock; 286 goto out_unlock;
287 287
288 err = ovl_create_real(wdir, opaquedir, 288 err = ovl_create_real(wdir, opaquedir, OVL_CATTR(stat.mode));
289 &(struct cattr){.mode = stat.mode}, NULL);
290 if (err) 289 if (err)
291 goto out_dput; 290 goto out_dput;
292 291
@@ -354,8 +353,7 @@ out_free:
354} 353}
355 354
356static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, 355static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
357 struct cattr *cattr, 356 struct ovl_cattr *cattr)
358 struct dentry *hardlink)
359{ 357{
360 struct dentry *workdir = ovl_workdir(dentry); 358 struct dentry *workdir = ovl_workdir(dentry);
361 struct inode *wdir = workdir->d_inode; 359 struct inode *wdir = workdir->d_inode;
@@ -365,6 +363,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
365 struct dentry *newdentry; 363 struct dentry *newdentry;
366 int err; 364 int err;
367 struct posix_acl *acl, *default_acl; 365 struct posix_acl *acl, *default_acl;
366 bool hardlink = !!cattr->hardlink;
368 367
369 if (WARN_ON(!workdir)) 368 if (WARN_ON(!workdir))
370 return -EROFS; 369 return -EROFS;
@@ -391,7 +390,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
391 if (IS_ERR(upper)) 390 if (IS_ERR(upper))
392 goto out_dput; 391 goto out_dput;
393 392
394 err = ovl_create_real(wdir, newdentry, cattr, hardlink); 393 err = ovl_create_real(wdir, newdentry, cattr);
395 if (err) 394 if (err)
396 goto out_dput2; 395 goto out_dput2;
397 396
@@ -439,7 +438,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
439 if (err) 438 if (err)
440 goto out_cleanup; 439 goto out_cleanup;
441 } 440 }
442 ovl_instantiate(dentry, inode, newdentry, !!hardlink); 441 ovl_instantiate(dentry, inode, newdentry, hardlink);
443 newdentry = NULL; 442 newdentry = NULL;
444out_dput2: 443out_dput2:
445 dput(upper); 444 dput(upper);
@@ -460,8 +459,7 @@ out_cleanup:
460} 459}
461 460
462static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, 461static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
463 struct cattr *attr, struct dentry *hardlink, 462 struct ovl_cattr *attr, bool origin)
464 bool origin)
465{ 463{
466 int err; 464 int err;
467 const struct cred *old_cred; 465 const struct cred *old_cred;
@@ -489,7 +487,7 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
489 if (override_cred) { 487 if (override_cred) {
490 override_cred->fsuid = inode->i_uid; 488 override_cred->fsuid = inode->i_uid;
491 override_cred->fsgid = inode->i_gid; 489 override_cred->fsgid = inode->i_gid;
492 if (!hardlink) { 490 if (!attr->hardlink) {
493 err = security_dentry_create_files_as(dentry, 491 err = security_dentry_create_files_as(dentry,
494 attr->mode, &dentry->d_name, old_cred, 492 attr->mode, &dentry->d_name, old_cred,
495 override_cred); 493 override_cred);
@@ -502,11 +500,9 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
502 put_cred(override_cred); 500 put_cred(override_cred);
503 501
504 if (!ovl_dentry_is_whiteout(dentry)) 502 if (!ovl_dentry_is_whiteout(dentry))
505 err = ovl_create_upper(dentry, inode, attr, 503 err = ovl_create_upper(dentry, inode, attr);
506 hardlink);
507 else 504 else
508 err = ovl_create_over_whiteout(dentry, inode, attr, 505 err = ovl_create_over_whiteout(dentry, inode, attr);
509 hardlink);
510 } 506 }
511out_revert_creds: 507out_revert_creds:
512 revert_creds(old_cred); 508 revert_creds(old_cred);
@@ -518,7 +514,7 @@ static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
518{ 514{
519 int err; 515 int err;
520 struct inode *inode; 516 struct inode *inode;
521 struct cattr attr = { 517 struct ovl_cattr attr = {
522 .rdev = rdev, 518 .rdev = rdev,
523 .link = link, 519 .link = link,
524 }; 520 };
@@ -535,7 +531,7 @@ static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
535 inode_init_owner(inode, dentry->d_parent->d_inode, mode); 531 inode_init_owner(inode, dentry->d_parent->d_inode, mode);
536 attr.mode = inode->i_mode; 532 attr.mode = inode->i_mode;
537 533
538 err = ovl_create_or_link(dentry, inode, &attr, NULL, false); 534 err = ovl_create_or_link(dentry, inode, &attr, false);
539 if (err) 535 if (err)
540 iput(inode); 536 iput(inode);
541 537
@@ -594,8 +590,9 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
594 inode = d_inode(old); 590 inode = d_inode(old);
595 ihold(inode); 591 ihold(inode);
596 592
597 err = ovl_create_or_link(new, inode, NULL, ovl_dentry_upper(old), 593 err = ovl_create_or_link(new, inode,
598 ovl_type_origin(old)); 594 &(struct ovl_cattr) {.hardlink = ovl_dentry_upper(old)},
595 ovl_type_origin(old));
599 if (err) 596 if (err)
600 iput(inode); 597 iput(inode);
601 598
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index 1c30d60cc290..aa8286419133 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -349,14 +349,17 @@ extern const struct inode_operations ovl_dir_inode_operations;
349struct dentry *ovl_lookup_temp(struct dentry *workdir); 349struct dentry *ovl_lookup_temp(struct dentry *workdir);
350int ovl_cleanup_and_whiteout(struct dentry *workdir, struct inode *dir, 350int ovl_cleanup_and_whiteout(struct dentry *workdir, struct inode *dir,
351 struct dentry *dentry); 351 struct dentry *dentry);
352struct cattr { 352struct ovl_cattr {
353 dev_t rdev; 353 dev_t rdev;
354 umode_t mode; 354 umode_t mode;
355 const char *link; 355 const char *link;
356 struct dentry *hardlink;
356}; 357};
358
359#define OVL_CATTR(m) (&(struct ovl_cattr) { .mode = (m) })
360
357int ovl_create_real(struct inode *dir, struct dentry *newdentry, 361int ovl_create_real(struct inode *dir, struct dentry *newdentry,
358 struct cattr *attr, 362 struct ovl_cattr *attr);
359 struct dentry *hardlink);
360int ovl_cleanup(struct inode *dir, struct dentry *dentry); 363int ovl_cleanup(struct inode *dir, struct dentry *dentry);
361 364
362/* copy_up.c */ 365/* copy_up.c */
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 94a7a654b0b8..286d36772e9c 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -611,9 +611,7 @@ retry:
611 goto retry; 611 goto retry;
612 } 612 }
613 613
614 err = ovl_create_real(dir, work, 614 err = ovl_create_real(dir, work, OVL_CATTR(attr.ia_mode));
615 &(struct cattr){.mode = S_IFDIR | 0},
616 NULL);
617 if (err) 615 if (err)
618 goto out_dput; 616 goto out_dput;
619 617