Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'overlayfs-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs

Pull two overlayfs fixes from Miklos Szeredi:
"Overlayfs rmdir() failed to check for emptiness in one case; this was
introduced in 4.0. The other bug was there since day one: failure to
mount if upper fs is full, which bit some OpenWRT folks"

* 'overlayfs-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs:
ovl: mount read-only if workdir can't be created
ovl: don't remove non-empty opaque directory

+36 -10
+3
fs/overlayfs/copy_up.c
··· 299 299 struct cred *override_cred; 300 300 char *link = NULL; 301 301 302 + if (WARN_ON(!workdir)) 303 + return -EROFS; 304 + 302 305 ovl_path_upper(parent, &parentpath); 303 306 upperdir = parentpath.dentry; 304 307
+28 -5
fs/overlayfs/dir.c
··· 222 222 struct kstat stat; 223 223 int err; 224 224 225 + if (WARN_ON(!workdir)) 226 + return ERR_PTR(-EROFS); 227 + 225 228 err = ovl_lock_rename_workdir(workdir, upperdir); 226 229 if (err) 227 230 goto out; ··· 324 321 struct dentry *upper; 325 322 struct dentry *newdentry; 326 323 int err; 324 + 325 + if (WARN_ON(!workdir)) 326 + return -EROFS; 327 327 328 328 err = ovl_lock_rename_workdir(workdir, upperdir); 329 329 if (err) ··· 512 506 struct dentry *opaquedir = NULL; 513 507 int err; 514 508 515 - if (is_dir && OVL_TYPE_MERGE_OR_LOWER(ovl_path_type(dentry))) { 516 - opaquedir = ovl_check_empty_and_clear(dentry); 517 - err = PTR_ERR(opaquedir); 518 - if (IS_ERR(opaquedir)) 519 - goto out; 509 + if (WARN_ON(!workdir)) 510 + return -EROFS; 511 + 512 + if (is_dir) { 513 + if (OVL_TYPE_MERGE_OR_LOWER(ovl_path_type(dentry))) { 514 + opaquedir = ovl_check_empty_and_clear(dentry); 515 + err = PTR_ERR(opaquedir); 516 + if (IS_ERR(opaquedir)) 517 + goto out; 518 + } else { 519 + LIST_HEAD(list); 520 + 521 + /* 522 + * When removing an empty opaque directory, then it 523 + * makes no sense to replace it with an exact replica of 524 + * itself. But emptiness still needs to be checked. 525 + */ 526 + err = ovl_check_empty_dir(dentry, &list); 527 + ovl_cache_free(&list); 528 + if (err) 529 + goto out; 530 + } 520 531 } 521 532 522 533 err = ovl_lock_rename_workdir(workdir, upperdir);
+5 -5
fs/overlayfs/super.c
··· 529 529 { 530 530 struct ovl_fs *ufs = sb->s_fs_info; 531 531 532 - if (!(*flags & MS_RDONLY) && !ufs->upper_mnt) 532 + if (!(*flags & MS_RDONLY) && (!ufs->upper_mnt || !ufs->workdir)) 533 533 return -EROFS; 534 534 535 535 return 0; ··· 925 925 ufs->workdir = ovl_workdir_create(ufs->upper_mnt, workpath.dentry); 926 926 err = PTR_ERR(ufs->workdir); 927 927 if (IS_ERR(ufs->workdir)) { 928 - pr_err("overlayfs: failed to create directory %s/%s\n", 929 - ufs->config.workdir, OVL_WORKDIR_NAME); 930 - goto out_put_upper_mnt; 928 + pr_warn("overlayfs: failed to create directory %s/%s (errno: %i); mounting read-only\n", 929 + ufs->config.workdir, OVL_WORKDIR_NAME, -err); 930 + sb->s_flags |= MS_RDONLY; 931 + ufs->workdir = NULL; 931 932 } 932 933 } 933 934 ··· 998 997 kfree(ufs->lower_mnt); 999 998 out_put_workdir: 1000 999 dput(ufs->workdir); 1001 - out_put_upper_mnt: 1002 1000 mntput(ufs->upper_mnt); 1003 1001 out_put_lowerpath: 1004 1002 for (i = 0; i < numlower; i++)