diff mbox series

ceph: set FMODE_CAN_ODIRECT instead of a dummy direct_IO method

Message ID 20230612053537.585525-1-hch@lst.de (mailing list archive)
State New, archived
Headers show
Series ceph: set FMODE_CAN_ODIRECT instead of a dummy direct_IO method | expand

Commit Message

Christoph Hellwig June 12, 2023, 5:35 a.m. UTC
Since commit a2ad63daa88b ("VFS: add FMODE_CAN_ODIRECT file flag") file
systems can just set the FMODE_CAN_ODIRECT flag at open time instead of
wiring up a dummy direct_IO method to indicate support for direct I/O.
Do that for ceph so that noop_direct_IO can eventually be removed.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/ceph/addr.c | 1 -
 fs/ceph/file.c | 2 ++
 2 files changed, 2 insertions(+), 1 deletion(-)

Comments

Xiubo Li June 13, 2023, 12:57 a.m. UTC | #1
On 6/12/23 13:35, Christoph Hellwig wrote:
> Since commit a2ad63daa88b ("VFS: add FMODE_CAN_ODIRECT file flag") file
> systems can just set the FMODE_CAN_ODIRECT flag at open time instead of
> wiring up a dummy direct_IO method to indicate support for direct I/O.
> Do that for ceph so that noop_direct_IO can eventually be removed.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>   fs/ceph/addr.c | 1 -
>   fs/ceph/file.c | 2 ++
>   2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index 6bb251a4d613eb..19c0f42540b600 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -1401,7 +1401,6 @@ const struct address_space_operations ceph_aops = {
>   	.dirty_folio = ceph_dirty_folio,
>   	.invalidate_folio = ceph_invalidate_folio,
>   	.release_folio = ceph_release_folio,
> -	.direct_IO = noop_direct_IO,
>   };
>   
>   static void ceph_block_sigs(sigset_t *oldset)
> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> index f4d8bf7dec88a8..314c5d5971bf4a 100644
> --- a/fs/ceph/file.c
> +++ b/fs/ceph/file.c
> @@ -368,6 +368,8 @@ int ceph_open(struct inode *inode, struct file *file)
>   	flags = file->f_flags & ~(O_CREAT|O_EXCL);
>   	if (S_ISDIR(inode->i_mode))
>   		flags = O_DIRECTORY;  /* mds likes to know */
> +	if (S_ISREG(inode->i_mode))
> +		file->f_mode |= FMODE_CAN_ODIRECT;
>   

Shouldn't we do the same in 'ceph_atomic_open()' too ?

Thanks

- Xiubo


>   	dout("open inode %p ino %llx.%llx file %p flags %d (%d)\n", inode,
>   	     ceph_vinop(inode), file, flags, file->f_flags);
Xiubo Li June 13, 2023, 1:06 a.m. UTC | #2
On 6/12/23 13:35, Christoph Hellwig wrote:
> Since commit a2ad63daa88b ("VFS: add FMODE_CAN_ODIRECT file flag") file
> systems can just set the FMODE_CAN_ODIRECT flag at open time instead of
> wiring up a dummy direct_IO method to indicate support for direct I/O.
> Do that for ceph so that noop_direct_IO can eventually be removed.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>   fs/ceph/addr.c | 1 -
>   fs/ceph/file.c | 2 ++
>   2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index 6bb251a4d613eb..19c0f42540b600 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -1401,7 +1401,6 @@ const struct address_space_operations ceph_aops = {
>   	.dirty_folio = ceph_dirty_folio,
>   	.invalidate_folio = ceph_invalidate_folio,
>   	.release_folio = ceph_release_folio,
> -	.direct_IO = noop_direct_IO,
>   };
>   
>   static void ceph_block_sigs(sigset_t *oldset)
> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> index f4d8bf7dec88a8..314c5d5971bf4a 100644
> --- a/fs/ceph/file.c
> +++ b/fs/ceph/file.c
> @@ -368,6 +368,8 @@ int ceph_open(struct inode *inode, struct file *file)
>   	flags = file->f_flags & ~(O_CREAT|O_EXCL);
>   	if (S_ISDIR(inode->i_mode))
>   		flags = O_DIRECTORY;  /* mds likes to know */
> +	if (S_ISREG(inode->i_mode))

BTW, the commit a2ad63daa88b ("VFS: add FMODE_CAN_ODIRECT file flag") 
doesn't check the S_ISREG, and I couldn't see this commit and NFS 
confine it to regular files, is that okay ?

Thanks

- Xiubo


> +		file->f_mode |= FMODE_CAN_ODIRECT;
>   
>   	dout("open inode %p ino %llx.%llx file %p flags %d (%d)\n", inode,
>   	     ceph_vinop(inode), file, flags, file->f_flags);
Christoph Hellwig June 13, 2023, 6:01 a.m. UTC | #3
On Tue, Jun 13, 2023 at 08:57:42AM +0800, Xiubo Li wrote:
>> +	if (S_ISREG(inode->i_mode))
>> +		file->f_mode |= FMODE_CAN_ODIRECT;
>>   
>
> Shouldn't we do the same in 'ceph_atomic_open()' too ?

Yes, probably.  Or I really need to press ahead and move the flag
to file operations..

>> --- a/fs/ceph/file.c
>> +++ b/fs/ceph/file.c
>> @@ -368,6 +368,8 @@ int ceph_open(struct inode *inode, struct file *file)
>>   	flags = file->f_flags & ~(O_CREAT|O_EXCL);
>>   	if (S_ISDIR(inode->i_mode))
>>   		flags = O_DIRECTORY;  /* mds likes to know */
>> +	if (S_ISREG(inode->i_mode))
>
> BTW, the commit a2ad63daa88b ("VFS: add FMODE_CAN_ODIRECT file flag") 
> doesn't check the S_ISREG, and I couldn't see this commit and NFS confine 
> it to regular files, is that okay ?

It doesn't have to.  ->direct_IO was previously set only for regular
files (and block devices in the block code).  So it makes sense to do
the same for the flag.
diff mbox series

Patch

diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 6bb251a4d613eb..19c0f42540b600 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1401,7 +1401,6 @@  const struct address_space_operations ceph_aops = {
 	.dirty_folio = ceph_dirty_folio,
 	.invalidate_folio = ceph_invalidate_folio,
 	.release_folio = ceph_release_folio,
-	.direct_IO = noop_direct_IO,
 };
 
 static void ceph_block_sigs(sigset_t *oldset)
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index f4d8bf7dec88a8..314c5d5971bf4a 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -368,6 +368,8 @@  int ceph_open(struct inode *inode, struct file *file)
 	flags = file->f_flags & ~(O_CREAT|O_EXCL);
 	if (S_ISDIR(inode->i_mode))
 		flags = O_DIRECTORY;  /* mds likes to know */
+	if (S_ISREG(inode->i_mode))
+		file->f_mode |= FMODE_CAN_ODIRECT;
 
 	dout("open inode %p ino %llx.%llx file %p flags %d (%d)\n", inode,
 	     ceph_vinop(inode), file, flags, file->f_flags);