Message ID | 20200720233739.824943-5-satyat@google.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | add support for direct I/O with fscrypt using blk-crypto | expand |
On 07/20, Satya Tangirala wrote: > From: Eric Biggers <ebiggers@google.com> > > Wire up ext4 with fscrypt direct I/O support. direct I/O with fscrypt is > only supported through blk-crypto (i.e. CONFIG_BLK_INLINE_ENCRYPTION must > have been enabled, the 'inlinecrypt' mount option must have been specified, > and either hardware inline encryption support must be present or > CONFIG_BLK_INLINE_ENCYRPTION_FALLBACK must have been enabled). Further, > direct I/O on encrypted files is only supported when I/O is aligned > to the filesystem block size (which is *not* necessarily the same as the > block device's block size). > > Signed-off-by: Eric Biggers <ebiggers@google.com> > Co-developed-by: Satya Tangirala <satyat@google.com> > Signed-off-by: Satya Tangirala <satyat@google.com> Reviewed-by: Jaegeuk Kim <jaegeuk@kernel.org> > --- > fs/ext4/file.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/fs/ext4/file.c b/fs/ext4/file.c > index 2a01e31a032c..d534f72675d9 100644 > --- a/fs/ext4/file.c > +++ b/fs/ext4/file.c > @@ -36,9 +36,11 @@ > #include "acl.h" > #include "truncate.h" > > -static bool ext4_dio_supported(struct inode *inode) > +static bool ext4_dio_supported(struct kiocb *iocb, struct iov_iter *iter) > { > - if (IS_ENABLED(CONFIG_FS_ENCRYPTION) && IS_ENCRYPTED(inode)) > + struct inode *inode = file_inode(iocb->ki_filp); > + > + if (!fscrypt_dio_supported(iocb, iter)) > return false; > if (fsverity_active(inode)) > return false; > @@ -61,7 +63,7 @@ static ssize_t ext4_dio_read_iter(struct kiocb *iocb, struct iov_iter *to) > inode_lock_shared(inode); > } > > - if (!ext4_dio_supported(inode)) { > + if (!ext4_dio_supported(iocb, to)) { > inode_unlock_shared(inode); > /* > * Fallback to buffered I/O if the operation being performed on > @@ -490,7 +492,7 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from) > } > > /* Fallback to buffered I/O if the inode does not support direct I/O. */ > - if (!ext4_dio_supported(inode)) { > + if (!ext4_dio_supported(iocb, from)) { > if (ilock_shared) > inode_unlock_shared(inode); > else > -- > 2.28.0.rc0.105.gf9edc3c819-goog
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 2a01e31a032c..d534f72675d9 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -36,9 +36,11 @@ #include "acl.h" #include "truncate.h" -static bool ext4_dio_supported(struct inode *inode) +static bool ext4_dio_supported(struct kiocb *iocb, struct iov_iter *iter) { - if (IS_ENABLED(CONFIG_FS_ENCRYPTION) && IS_ENCRYPTED(inode)) + struct inode *inode = file_inode(iocb->ki_filp); + + if (!fscrypt_dio_supported(iocb, iter)) return false; if (fsverity_active(inode)) return false; @@ -61,7 +63,7 @@ static ssize_t ext4_dio_read_iter(struct kiocb *iocb, struct iov_iter *to) inode_lock_shared(inode); } - if (!ext4_dio_supported(inode)) { + if (!ext4_dio_supported(iocb, to)) { inode_unlock_shared(inode); /* * Fallback to buffered I/O if the operation being performed on @@ -490,7 +492,7 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from) } /* Fallback to buffered I/O if the inode does not support direct I/O. */ - if (!ext4_dio_supported(inode)) { + if (!ext4_dio_supported(iocb, from)) { if (ilock_shared) inode_unlock_shared(inode); else