diff options
author | Amir Goldstein <amir73il@gmail.com> | 2018-05-16 10:35:02 -0400 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2018-05-31 05:06:10 -0400 |
commit | 471ec5dcf4e712ea81bf431a57c98d4b67416d30 (patch) | |
tree | d6e76dcc4899cded83e2bfce352d197fe5cfe1c0 | |
parent | 6cf00764b0082cefdaf5a36202aceb1ab2470051 (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.c | 5 | ||||
-rw-r--r-- | fs/overlayfs/dir.c | 45 | ||||
-rw-r--r-- | fs/overlayfs/overlayfs.h | 9 | ||||
-rw-r--r-- | fs/overlayfs/super.c | 4 |
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 | ||
117 | int ovl_create_real(struct inode *dir, struct dentry *newdentry, | 117 | int 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 | ||
215 | static int ovl_create_upper(struct dentry *dentry, struct inode *inode, | 215 | static 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; |
243 | out_dput: | 243 | out_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 | ||
356 | static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, | 355 | static 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; |
444 | out_dput2: | 443 | out_dput2: |
445 | dput(upper); | 444 | dput(upper); |
@@ -460,8 +459,7 @@ out_cleanup: | |||
460 | } | 459 | } |
461 | 460 | ||
462 | static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, | 461 | static 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 | } |
511 | out_revert_creds: | 507 | out_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; | |||
349 | struct dentry *ovl_lookup_temp(struct dentry *workdir); | 349 | struct dentry *ovl_lookup_temp(struct dentry *workdir); |
350 | int ovl_cleanup_and_whiteout(struct dentry *workdir, struct inode *dir, | 350 | int ovl_cleanup_and_whiteout(struct dentry *workdir, struct inode *dir, |
351 | struct dentry *dentry); | 351 | struct dentry *dentry); |
352 | struct cattr { | 352 | struct 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 | |||
357 | int ovl_create_real(struct inode *dir, struct dentry *newdentry, | 361 | int ovl_create_real(struct inode *dir, struct dentry *newdentry, |
358 | struct cattr *attr, | 362 | struct ovl_cattr *attr); |
359 | struct dentry *hardlink); | ||
360 | int ovl_cleanup(struct inode *dir, struct dentry *dentry); | 363 | int 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 | ||