Message ID | 20240119184742.31088-2-krisman@suse.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Set casefold/fscrypt dentry operations through sb->s_d_op | expand |
On Fri, Jan 19, 2024 at 03:47:33PM -0300, Gabriel Krisman Bertazi wrote: > ovl: Reject mounting case-insensitive filesystems Overlayfs doesn't mount filesystems. I think you might mean something like reject case-insensitive lowerdirs? > + /* > + * Root dentries of case-insensitive filesystems might not have > + * the dentry operations set, but still be incompatible with > + * overlayfs. Check explicitly to prevent post-mount failures. > + */ > + if (sb_has_encoding(path->mnt->mnt_sb)) > + return invalfc(fc, "case-insensitive filesystem on %s not supported", name); sb_has_encoding() doesn't mean that the filesystem is case-insensitive. It means that the filesystem supports individual case-insensitive directories. With that in mind, is this code still working as intended? If so, can you update the comment and error message accordingly? - Eric
Eric Biggers <ebiggers@kernel.org> writes: > On Fri, Jan 19, 2024 at 03:47:33PM -0300, Gabriel Krisman Bertazi wrote: >> ovl: Reject mounting case-insensitive filesystems > > Overlayfs doesn't mount filesystems. I think you might mean something like > reject case-insensitive lowerdirs? uppers and workdir too. I'd make this: "ovl: Reject mounting over case-insensitive filesystems" > >> + /* >> + * Root dentries of case-insensitive filesystems might not have >> + * the dentry operations set, but still be incompatible with >> + * overlayfs. Check explicitly to prevent post-mount failures. >> + */ >> + if (sb_has_encoding(path->mnt->mnt_sb)) >> + return invalfc(fc, "case-insensitive filesystem on %s not supported", name); > > sb_has_encoding() doesn't mean that the filesystem is case-insensitive. It > means that the filesystem supports individual case-insensitive > directories. > > With that in mind, is this code still working as intended? > Yes, it is. In particular, after the rest of the patchset, any dentry will be weird and lookups will throw -EREMOTE. > If so, can you update the comment and error message accordingly? I'm not sure how to change and still make it readable by users. How about: return invalfc(fc, "case-insensitive capable filesystem on %s not supported", name); what do you think?
On Thu, Jan 25, 2024 at 01:55:00PM -0300, Gabriel Krisman Bertazi wrote: > I'm not sure how to change and still make it readable by users. How about: > > return invalfc(fc, "case-insensitive capable filesystem on %s not supported", name); > > what do you think? "case-insensitive capable" sounds good. - Eric
diff --git a/fs/overlayfs/params.c b/fs/overlayfs/params.c index 3fe2dde1598f..09a4973f26f9 100644 --- a/fs/overlayfs/params.c +++ b/fs/overlayfs/params.c @@ -280,12 +280,19 @@ static int ovl_mount_dir_check(struct fs_context *fc, const struct path *path, { struct ovl_fs_context *ctx = fc->fs_private; - if (ovl_dentry_weird(path->dentry)) - return invalfc(fc, "filesystem on %s not supported", name); - if (!d_is_dir(path->dentry)) return invalfc(fc, "%s is not a directory", name); + /* + * Root dentries of case-insensitive filesystems might not have + * the dentry operations set, but still be incompatible with + * overlayfs. Check explicitly to prevent post-mount failures. + */ + if (sb_has_encoding(path->mnt->mnt_sb)) + return invalfc(fc, "case-insensitive filesystem on %s not supported", name); + + if (ovl_dentry_weird(path->dentry)) + return invalfc(fc, "filesystem on %s not supported", name); /* * Check whether upper path is read-only here to report failures diff --git a/include/linux/fs.h b/include/linux/fs.h index 98b7a7a8c42e..e6667ece5e64 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3203,6 +3203,15 @@ extern int generic_check_addressable(unsigned, u64); extern void generic_set_encrypted_ci_d_ops(struct dentry *dentry); +static inline bool sb_has_encoding(const struct super_block *sb) +{ +#if IS_ENABLED(CONFIG_UNICODE) + return !!sb->s_encoding; +#else + return false; +#endif +} + int may_setattr(struct mnt_idmap *idmap, struct inode *inode, unsigned int ia_valid); int setattr_prepare(struct mnt_idmap *, struct dentry *, struct iattr *);