FAILED: patch "[PATCH] ovl: fix IOCB_DIRECT if underlying fs doesn't support direct" failed to apply to 5.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1dc1eed46f9fa4cb8a07baa24fb44c96d6dd35c9 Mon Sep 17 00:00:00 2001
From: Miklos Szeredi <[email protected]>
Date: Mon, 27 Sep 2021 11:23:57 +0200
Subject: [PATCH] ovl: fix IOCB_DIRECT if underlying fs doesn't support direct
IO
Normally the check at open time suffices, but e.g loop device does set IOCB_DIRECT after doing its own checks (which are not sufficent for overlayfs).
Make sure we don't call the underlying filesystem read/write method with the IOCB_DIRECT if it's not supported.
fs/overlayfs/file.c +14 -1
@@ -296,6 +296,12 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)if (ret)return ret; + ret = -EINVAL ; +if (iocb->ki_flags &IOCB_DIRECT && + (!real.file->f_mapping->a_ops || + !real.file->f_mapping->a_ops->direct_IO)) + goto out_fdput; + old_cred =ovl_override_creds (file_inode (file)->i_sb);if (is_sync_kiocb (iocb)) { ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
@@ -320,7 +326,7 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter) out:revert_creds (old_cred);ovl_file_accessed (file); - +out_fdput:fdput (real);return ret;
@@ -349,6 +355,12 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)if (ret) goto out_unlock; + ret = -EINVAL ; +if (iocb->ki_flags &IOCB_DIRECT && + (!real.file->f_mapping->a_ops || + !real.file->f_mapping->a_ops->direct_IO)) + goto out_fdput; +if (!ovl_should_sync (OVL_FS (inode->i_sb))) ifl &= ~(IOCB_DSYNC |IOCB_SYNC );
@@ -384,6 +396,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) } out:revert_creds (old_cred); +out_fdput:fdput (real); out_unlock: