Message ID | 20230829161116.2914040-3-bschubert@ddn.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fuse direct write consolidation and parallel IO | expand |
On Tue, 29 Aug 2023 at 18:11, Bernd Schubert <bschubert@ddn.com> wrote: > > This is just a preparation to avoid code duplication in the next > commit. > > Cc: Hao Xu <howeyxu@tencent.com> > Cc: Miklos Szeredi <miklos@szeredi.hu> > Cc: Dharmendra Singh <dsingh@ddn.com> > Signed-off-by: Bernd Schubert <bschubert@ddn.com> > --- > fs/fuse/file.c | 48 +++++++++++++++++++++++++++++++++--------------- > 1 file changed, 33 insertions(+), 15 deletions(-) > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > index b1b9f2b9a37d..6b8b9512c336 100644 > --- a/fs/fuse/file.c > +++ b/fs/fuse/file.c > @@ -1298,6 +1298,37 @@ static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii) > return res; > } > > +static bool fuse_io_past_eof(struct kiocb *iocb, > + struct iov_iter *iter) > +{ > + struct inode *inode = file_inode(iocb->ki_filp); > + > + return iocb->ki_pos + iov_iter_count(iter) > i_size_read(inode); > +} > + > +/* > + * @return true if an exclusive lock direct IO writes is needed > + */ > +static bool fuse_dio_wr_exclusive_lock(struct kiocb *iocb, struct iov_iter *from) > +{ > + struct file *file = iocb->ki_filp; > + struct fuse_file *ff = file->private_data; > + > + /* server side has to advise that it supports parallel dio writes */ > + if (!(ff->open_flags & FOPEN_PARALLEL_DIRECT_WRITES)) > + return false; You got the return values the wrong way around. I can fix this, no need to resend. Thanks, Miklos
On 8/30/23 12:57, Miklos Szeredi wrote: > On Tue, 29 Aug 2023 at 18:11, Bernd Schubert <bschubert@ddn.com> wrote: >> >> This is just a preparation to avoid code duplication in the next >> commit. >> >> Cc: Hao Xu <howeyxu@tencent.com> >> Cc: Miklos Szeredi <miklos@szeredi.hu> >> Cc: Dharmendra Singh <dsingh@ddn.com> >> Signed-off-by: Bernd Schubert <bschubert@ddn.com> >> --- >> fs/fuse/file.c | 48 +++++++++++++++++++++++++++++++++--------------- >> 1 file changed, 33 insertions(+), 15 deletions(-) >> >> diff --git a/fs/fuse/file.c b/fs/fuse/file.c >> index b1b9f2b9a37d..6b8b9512c336 100644 >> --- a/fs/fuse/file.c >> +++ b/fs/fuse/file.c >> @@ -1298,6 +1298,37 @@ static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii) >> return res; >> } >> >> +static bool fuse_io_past_eof(struct kiocb *iocb, >> + struct iov_iter *iter) >> +{ >> + struct inode *inode = file_inode(iocb->ki_filp); >> + >> + return iocb->ki_pos + iov_iter_count(iter) > i_size_read(inode); >> +} >> + >> +/* >> + * @return true if an exclusive lock direct IO writes is needed >> + */ >> +static bool fuse_dio_wr_exclusive_lock(struct kiocb *iocb, struct iov_iter *from) >> +{ >> + struct file *file = iocb->ki_filp; >> + struct fuse_file *ff = file->private_data; >> + >> + /* server side has to advise that it supports parallel dio writes */ >> + if (!(ff->open_flags & FOPEN_PARALLEL_DIRECT_WRITES)) >> + return false; > > You got the return values the wrong way around. I can fix this, no > need to resend. Ooops, sorry! Do you mind to take this series for next merge round? I obviously didn't test the latest series yet and I would like to first test performance and do several rounds of xfs tests. That should be done by Monday, but might be a bit late for 6.6 Thanks, Bernd
On Wed, 30 Aug 2023 at 14:13, Bernd Schubert <aakef@fastmail.fm> wrote: > > > > On 8/30/23 12:57, Miklos Szeredi wrote: > > On Tue, 29 Aug 2023 at 18:11, Bernd Schubert <bschubert@ddn.com> wrote: > >> > >> This is just a preparation to avoid code duplication in the next > >> commit. > >> > >> Cc: Hao Xu <howeyxu@tencent.com> > >> Cc: Miklos Szeredi <miklos@szeredi.hu> > >> Cc: Dharmendra Singh <dsingh@ddn.com> > >> Signed-off-by: Bernd Schubert <bschubert@ddn.com> > >> --- > >> fs/fuse/file.c | 48 +++++++++++++++++++++++++++++++++--------------- > >> 1 file changed, 33 insertions(+), 15 deletions(-) > >> > >> diff --git a/fs/fuse/file.c b/fs/fuse/file.c > >> index b1b9f2b9a37d..6b8b9512c336 100644 > >> --- a/fs/fuse/file.c > >> +++ b/fs/fuse/file.c > >> @@ -1298,6 +1298,37 @@ static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii) > >> return res; > >> } > >> > >> +static bool fuse_io_past_eof(struct kiocb *iocb, > >> + struct iov_iter *iter) > >> +{ > >> + struct inode *inode = file_inode(iocb->ki_filp); > >> + > >> + return iocb->ki_pos + iov_iter_count(iter) > i_size_read(inode); > >> +} > >> + > >> +/* > >> + * @return true if an exclusive lock direct IO writes is needed > >> + */ > >> +static bool fuse_dio_wr_exclusive_lock(struct kiocb *iocb, struct iov_iter *from) > >> +{ > >> + struct file *file = iocb->ki_filp; > >> + struct fuse_file *ff = file->private_data; > >> + > >> + /* server side has to advise that it supports parallel dio writes */ > >> + if (!(ff->open_flags & FOPEN_PARALLEL_DIRECT_WRITES)) > >> + return false; > > > > You got the return values the wrong way around. I can fix this, no > > need to resend. > > Ooops, sorry! Do you mind to take this series for next merge round? I > obviously didn't test the latest series yet and I would like to first > test performance and do several rounds of xfs tests. That should be done > by Monday, but might be a bit late for 6.6 Right, this should aim for 6.7. Thanks, Miklos
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index b1b9f2b9a37d..6b8b9512c336 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1298,6 +1298,37 @@ static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii) return res; } +static bool fuse_io_past_eof(struct kiocb *iocb, + struct iov_iter *iter) +{ + struct inode *inode = file_inode(iocb->ki_filp); + + return iocb->ki_pos + iov_iter_count(iter) > i_size_read(inode); +} + +/* + * @return true if an exclusive lock direct IO writes is needed + */ +static bool fuse_dio_wr_exclusive_lock(struct kiocb *iocb, struct iov_iter *from) +{ + struct file *file = iocb->ki_filp; + struct fuse_file *ff = file->private_data; + + /* server side has to advise that it supports parallel dio writes */ + if (!(ff->open_flags & FOPEN_PARALLEL_DIRECT_WRITES)) + return false; + + /* append will need to know the eventual eof - always needs a lock */ + if (iocb->ki_flags & IOCB_APPEND) + return false; + + /* parallel dio beyond eof is at least for now not supported */ + if (fuse_io_past_eof(iocb, from)) + return false; + + return true; +} + static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from) { struct file *file = iocb->ki_filp; @@ -1557,25 +1588,12 @@ static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to) return res; } -static bool fuse_direct_write_extending_i_size(struct kiocb *iocb, - struct iov_iter *iter) -{ - struct inode *inode = file_inode(iocb->ki_filp); - - return iocb->ki_pos + iov_iter_count(iter) > i_size_read(inode); -} - static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) { struct inode *inode = file_inode(iocb->ki_filp); - struct file *file = iocb->ki_filp; - struct fuse_file *ff = file->private_data; struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); ssize_t res; - bool exclusive_lock = - !(ff->open_flags & FOPEN_PARALLEL_DIRECT_WRITES) || - iocb->ki_flags & IOCB_APPEND || - fuse_direct_write_extending_i_size(iocb, from); + bool exclusive_lock = fuse_dio_wr_exclusive_lock(iocb, from); /* * Take exclusive lock if @@ -1591,7 +1609,7 @@ static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) /* A race with truncate might have come up as the decision for * the lock type was done without holding the lock, check again. */ - if (fuse_direct_write_extending_i_size(iocb, from)) { + if (fuse_io_past_eof(iocb, from)) { inode_unlock_shared(inode); inode_lock(inode); exclusive_lock = true;
This is just a preparation to avoid code duplication in the next commit. Cc: Hao Xu <howeyxu@tencent.com> Cc: Miklos Szeredi <miklos@szeredi.hu> Cc: Dharmendra Singh <dsingh@ddn.com> Signed-off-by: Bernd Schubert <bschubert@ddn.com> --- fs/fuse/file.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-)