Re: [Devel] [PATCH] fs/fuse kio: invalidate files for kio
No On 21.01.2019 19:43, Pavel Butsykin wrote: > Good, Thanks! > > By the way, is there any response to "Prevent background write requests > increase inode size" ? > > On 21.01.2019 19:29, Kirill Tkhai wrote: >> JFI: I submitted to mainstream patches for breaking fc->lock dependence: >> >> https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=for-next >> >> I'm going to backport them to us next week. >> >> On 21.01.2019 19:27, Pavel Butsykin wrote: >>> I agree fc->lock is evil, but fc->lock is not a necessary condition for >>> implementation kio queue, so let's look at my second try. >>> >>> On 18.01.2019 18:00, Alexey Kuznetsov wrote: Hello! Huh? We were going to get rid of fc->lock and definitely are not going to add new ones. It is exactly why it was not made in the first place. On Fri, Jan 18, 2019 at 4:44 PM Pavel Butsykin wrote: > > Make fuse_invalidate_files() work for kio. This is necessary to maintain > vstorage revoke in FPath mode. To do this, let's add a list of inflight > kio > requests to be able to handle this list in fuse_invalidate_files(). The > list > will also be useful to implement the full-featured .vstorage.info and > fuse_abort_conn() for kio. > > #VSTOR-19620 > > Signed-off-by: Pavel Butsykin > --- >fs/fuse/fuse_i.h | 4 >fs/fuse/inode.c| 8 ++-- >fs/fuse/kio/pcs/fuse_io.c | 5 + >fs/fuse/kio/pcs/pcs_cluster.c | 2 ++ >fs/fuse/kio/pcs/pcs_cluster.h | 1 + >fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 16 >6 files changed, 34 insertions(+), 2 deletions(-) > > diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h > index 4c27bfa0e74d..0914940d6735 100644 > --- a/fs/fuse/fuse_i.h > +++ b/fs/fuse/fuse_i.h > @@ -528,6 +528,7 @@ struct fuse_kio_ops { > int (*file_open)(struct fuse_conn *fc, struct file *file, > struct inode *inode); > void (*inode_release)(struct fuse_inode *fi); > + void (*kill_requests)(struct fuse_conn *fc, struct inode *inode); > >}; >int fuse_register_kio(struct fuse_kio_ops *ops); > @@ -1107,4 +1108,7 @@ struct fuse_file *fuse_write_file(struct fuse_conn > *fc, struct fuse_inode *fi); > >void fuse_release_ff(struct inode *inode, struct fuse_file *ff); > > +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, > + struct list_head *req_list); > + >#endif /* _FS_FUSE_I_H */ > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c > index 34e52262d37e..cb275ff21991 100644 > --- a/fs/fuse/inode.c > +++ b/fs/fuse/inode.c > @@ -369,8 +369,8 @@ int fuse_reverse_inval_inode(struct super_block *sb, > u64 nodeid, > return 0; >} > > -static void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, > - struct list_head *req_list) > +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, > + struct list_head *req_list) >{ > struct fuse_req *req; > > @@ -393,6 +393,7 @@ static void fuse_kill_requests(struct fuse_conn *fc, > struct inode *inode, > req->num_pages = 0; > } >} > +EXPORT_SYMBOL_GPL(fuse_kill_requests); > >int fuse_invalidate_files(struct fuse_conn *fc, u64 nodeid) >{ > @@ -442,6 +443,9 @@ int fuse_invalidate_files(struct fuse_conn *fc, u64 > nodeid) > } > fuse_kill_requests(fc, inode, >main_iq.pending); > fuse_kill_requests(fc, inode, >bg_queue); > + if (fc->kio.op && fc->kio.op->kill_requests) > + fc->kio.op->kill_requests(fc, inode); > + > wake_up(>page_waitq); /* readpage[s] can wait on > fuse wb */ > spin_unlock(>lock); > > diff --git a/fs/fuse/kio/pcs/fuse_io.c b/fs/fuse/kio/pcs/fuse_io.c > index 61a2e7f1eac6..00a72c878efb 100644 > --- a/fs/fuse/kio/pcs/fuse_io.c > +++ b/fs/fuse/kio/pcs/fuse_io.c > @@ -205,6 +205,7 @@ static void prepare_io_(struct pcs_fuse_req *r, > unsigned short type, off_t offse >static void ioreq_complete(pcs_api_iorequest_t *ioreq) >{ > struct pcs_fuse_req *r = ioreq->datasource; > + struct fuse_conn *fc = cl_from_req(r)->fc; > > BUG_ON(ioreq != >exec.io.req); > > @@ -217,6 +218,10 @@ static void ioreq_complete(pcs_api_iorequest_t > *ioreq) > r->req.out.h.error = 0; > } > > + spin_lock(>lock); > + list_del_init(>req.list); > +
Re: [Devel] [PATCH] fs/fuse kio: invalidate files for kio
Good, Thanks! By the way, is there any response to "Prevent background write requests increase inode size" ? On 21.01.2019 19:29, Kirill Tkhai wrote: > JFI: I submitted to mainstream patches for breaking fc->lock dependence: > > https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=for-next > > I'm going to backport them to us next week. > > On 21.01.2019 19:27, Pavel Butsykin wrote: >> I agree fc->lock is evil, but fc->lock is not a necessary condition for >> implementation kio queue, so let's look at my second try. >> >> On 18.01.2019 18:00, Alexey Kuznetsov wrote: >>> Hello! >>> >>> Huh? We were going to get rid of fc->lock and definitely are not going >>> to add new ones. >>> It is exactly why it was not made in the first place. >>> >>> On Fri, Jan 18, 2019 at 4:44 PM Pavel Butsykin >>> wrote: Make fuse_invalidate_files() work for kio. This is necessary to maintain vstorage revoke in FPath mode. To do this, let's add a list of inflight kio requests to be able to handle this list in fuse_invalidate_files(). The list will also be useful to implement the full-featured .vstorage.info and fuse_abort_conn() for kio. #VSTOR-19620 Signed-off-by: Pavel Butsykin --- fs/fuse/fuse_i.h | 4 fs/fuse/inode.c| 8 ++-- fs/fuse/kio/pcs/fuse_io.c | 5 + fs/fuse/kio/pcs/pcs_cluster.c | 2 ++ fs/fuse/kio/pcs/pcs_cluster.h | 1 + fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 16 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 4c27bfa0e74d..0914940d6735 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -528,6 +528,7 @@ struct fuse_kio_ops { int (*file_open)(struct fuse_conn *fc, struct file *file, struct inode *inode); void (*inode_release)(struct fuse_inode *fi); + void (*kill_requests)(struct fuse_conn *fc, struct inode *inode); }; int fuse_register_kio(struct fuse_kio_ops *ops); @@ -1107,4 +1108,7 @@ struct fuse_file *fuse_write_file(struct fuse_conn *fc, struct fuse_inode *fi); void fuse_release_ff(struct inode *inode, struct fuse_file *ff); +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, + struct list_head *req_list); + #endif /* _FS_FUSE_I_H */ diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 34e52262d37e..cb275ff21991 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -369,8 +369,8 @@ int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid, return 0; } -static void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, - struct list_head *req_list) +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, + struct list_head *req_list) { struct fuse_req *req; @@ -393,6 +393,7 @@ static void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, req->num_pages = 0; } } +EXPORT_SYMBOL_GPL(fuse_kill_requests); int fuse_invalidate_files(struct fuse_conn *fc, u64 nodeid) { @@ -442,6 +443,9 @@ int fuse_invalidate_files(struct fuse_conn *fc, u64 nodeid) } fuse_kill_requests(fc, inode, >main_iq.pending); fuse_kill_requests(fc, inode, >bg_queue); + if (fc->kio.op && fc->kio.op->kill_requests) + fc->kio.op->kill_requests(fc, inode); + wake_up(>page_waitq); /* readpage[s] can wait on fuse wb */ spin_unlock(>lock); diff --git a/fs/fuse/kio/pcs/fuse_io.c b/fs/fuse/kio/pcs/fuse_io.c index 61a2e7f1eac6..00a72c878efb 100644 --- a/fs/fuse/kio/pcs/fuse_io.c +++ b/fs/fuse/kio/pcs/fuse_io.c @@ -205,6 +205,7 @@ static void prepare_io_(struct pcs_fuse_req *r, unsigned short type, off_t offse static void ioreq_complete(pcs_api_iorequest_t *ioreq) { struct pcs_fuse_req *r = ioreq->datasource; + struct fuse_conn *fc = cl_from_req(r)->fc; BUG_ON(ioreq != >exec.io.req); @@ -217,6 +218,10 @@ static void ioreq_complete(pcs_api_iorequest_t *ioreq) r->req.out.h.error = 0; } + spin_lock(>lock); + list_del_init(>req.list); + spin_unlock(>lock); + switch (ioreq->type) { case PCS_REQ_T_READ: on_read_done(r, ioreq->size); diff --git
Re: [Devel] [PATCH] fs/fuse kio: invalidate files for kio
JFI: I submitted to mainstream patches for breaking fc->lock dependence: https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/log/?h=for-next I'm going to backport them to us next week. On 21.01.2019 19:27, Pavel Butsykin wrote: > I agree fc->lock is evil, but fc->lock is not a necessary condition for > implementation kio queue, so let's look at my second try. > > On 18.01.2019 18:00, Alexey Kuznetsov wrote: >> Hello! >> >> Huh? We were going to get rid of fc->lock and definitely are not going >> to add new ones. >> It is exactly why it was not made in the first place. >> >> On Fri, Jan 18, 2019 at 4:44 PM Pavel Butsykin >> wrote: >>> >>> Make fuse_invalidate_files() work for kio. This is necessary to maintain >>> vstorage revoke in FPath mode. To do this, let's add a list of inflight kio >>> requests to be able to handle this list in fuse_invalidate_files(). The list >>> will also be useful to implement the full-featured .vstorage.info and >>> fuse_abort_conn() for kio. >>> >>> #VSTOR-19620 >>> >>> Signed-off-by: Pavel Butsykin >>> --- >>> fs/fuse/fuse_i.h | 4 >>> fs/fuse/inode.c| 8 ++-- >>> fs/fuse/kio/pcs/fuse_io.c | 5 + >>> fs/fuse/kio/pcs/pcs_cluster.c | 2 ++ >>> fs/fuse/kio/pcs/pcs_cluster.h | 1 + >>> fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 16 >>> 6 files changed, 34 insertions(+), 2 deletions(-) >>> >>> diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h >>> index 4c27bfa0e74d..0914940d6735 100644 >>> --- a/fs/fuse/fuse_i.h >>> +++ b/fs/fuse/fuse_i.h >>> @@ -528,6 +528,7 @@ struct fuse_kio_ops { >>> int (*file_open)(struct fuse_conn *fc, struct file *file, >>>struct inode *inode); >>> void (*inode_release)(struct fuse_inode *fi); >>> + void (*kill_requests)(struct fuse_conn *fc, struct inode *inode); >>> >>> }; >>> int fuse_register_kio(struct fuse_kio_ops *ops); >>> @@ -1107,4 +1108,7 @@ struct fuse_file *fuse_write_file(struct fuse_conn >>> *fc, struct fuse_inode *fi); >>> >>> void fuse_release_ff(struct inode *inode, struct fuse_file *ff); >>> >>> +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, >>> + struct list_head *req_list); >>> + >>> #endif /* _FS_FUSE_I_H */ >>> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c >>> index 34e52262d37e..cb275ff21991 100644 >>> --- a/fs/fuse/inode.c >>> +++ b/fs/fuse/inode.c >>> @@ -369,8 +369,8 @@ int fuse_reverse_inval_inode(struct super_block *sb, >>> u64 nodeid, >>> return 0; >>> } >>> >>> -static void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, >>> - struct list_head *req_list) >>> +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, >>> + struct list_head *req_list) >>> { >>> struct fuse_req *req; >>> >>> @@ -393,6 +393,7 @@ static void fuse_kill_requests(struct fuse_conn *fc, >>> struct inode *inode, >>> req->num_pages = 0; >>> } >>> } >>> +EXPORT_SYMBOL_GPL(fuse_kill_requests); >>> >>> int fuse_invalidate_files(struct fuse_conn *fc, u64 nodeid) >>> { >>> @@ -442,6 +443,9 @@ int fuse_invalidate_files(struct fuse_conn *fc, u64 >>> nodeid) >>> } >>> fuse_kill_requests(fc, inode, >main_iq.pending); >>> fuse_kill_requests(fc, inode, >bg_queue); >>> + if (fc->kio.op && fc->kio.op->kill_requests) >>> + fc->kio.op->kill_requests(fc, inode); >>> + >>> wake_up(>page_waitq); /* readpage[s] can wait on fuse >>> wb */ >>> spin_unlock(>lock); >>> >>> diff --git a/fs/fuse/kio/pcs/fuse_io.c b/fs/fuse/kio/pcs/fuse_io.c >>> index 61a2e7f1eac6..00a72c878efb 100644 >>> --- a/fs/fuse/kio/pcs/fuse_io.c >>> +++ b/fs/fuse/kio/pcs/fuse_io.c >>> @@ -205,6 +205,7 @@ static void prepare_io_(struct pcs_fuse_req *r, >>> unsigned short type, off_t offse >>> static void ioreq_complete(pcs_api_iorequest_t *ioreq) >>> { >>> struct pcs_fuse_req *r = ioreq->datasource; >>> + struct fuse_conn *fc = cl_from_req(r)->fc; >>> >>> BUG_ON(ioreq != >exec.io.req); >>> >>> @@ -217,6 +218,10 @@ static void ioreq_complete(pcs_api_iorequest_t *ioreq) >>> r->req.out.h.error = 0; >>> } >>> >>> + spin_lock(>lock); >>> + list_del_init(>req.list); >>> + spin_unlock(>lock); >>> + >>> switch (ioreq->type) { >>> case PCS_REQ_T_READ: >>> on_read_done(r, ioreq->size); >>> diff --git a/fs/fuse/kio/pcs/pcs_cluster.c b/fs/fuse/kio/pcs/pcs_cluster.c >>> index 5df263f01f98..6b8f38db5c40 100644 >>> --- a/fs/fuse/kio/pcs/pcs_cluster.c >>> +++ b/fs/fuse/kio/pcs/pcs_cluster.c >>> @@ -608,6 +608,8 @@ int pcs_cluster_init(struct pcs_fuse_cluster *pfc, >>> struct workqueue_struct *wq, >>> pfc->cc.op.ireq_on_error
Re: [Devel] [PATCH] fs/fuse kio: invalidate files for kio
I agree fc->lock is evil, but fc->lock is not a necessary condition for implementation kio queue, so let's look at my second try. On 18.01.2019 18:00, Alexey Kuznetsov wrote: > Hello! > > Huh? We were going to get rid of fc->lock and definitely are not going > to add new ones. > It is exactly why it was not made in the first place. > > On Fri, Jan 18, 2019 at 4:44 PM Pavel Butsykin > wrote: >> >> Make fuse_invalidate_files() work for kio. This is necessary to maintain >> vstorage revoke in FPath mode. To do this, let's add a list of inflight kio >> requests to be able to handle this list in fuse_invalidate_files(). The list >> will also be useful to implement the full-featured .vstorage.info and >> fuse_abort_conn() for kio. >> >> #VSTOR-19620 >> >> Signed-off-by: Pavel Butsykin >> --- >> fs/fuse/fuse_i.h | 4 >> fs/fuse/inode.c| 8 ++-- >> fs/fuse/kio/pcs/fuse_io.c | 5 + >> fs/fuse/kio/pcs/pcs_cluster.c | 2 ++ >> fs/fuse/kio/pcs/pcs_cluster.h | 1 + >> fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 16 >> 6 files changed, 34 insertions(+), 2 deletions(-) >> >> diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h >> index 4c27bfa0e74d..0914940d6735 100644 >> --- a/fs/fuse/fuse_i.h >> +++ b/fs/fuse/fuse_i.h >> @@ -528,6 +528,7 @@ struct fuse_kio_ops { >> int (*file_open)(struct fuse_conn *fc, struct file *file, >>struct inode *inode); >> void (*inode_release)(struct fuse_inode *fi); >> + void (*kill_requests)(struct fuse_conn *fc, struct inode *inode); >> >> }; >> int fuse_register_kio(struct fuse_kio_ops *ops); >> @@ -1107,4 +1108,7 @@ struct fuse_file *fuse_write_file(struct fuse_conn >> *fc, struct fuse_inode *fi); >> >> void fuse_release_ff(struct inode *inode, struct fuse_file *ff); >> >> +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, >> + struct list_head *req_list); >> + >> #endif /* _FS_FUSE_I_H */ >> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c >> index 34e52262d37e..cb275ff21991 100644 >> --- a/fs/fuse/inode.c >> +++ b/fs/fuse/inode.c >> @@ -369,8 +369,8 @@ int fuse_reverse_inval_inode(struct super_block *sb, u64 >> nodeid, >> return 0; >> } >> >> -static void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, >> - struct list_head *req_list) >> +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, >> + struct list_head *req_list) >> { >> struct fuse_req *req; >> >> @@ -393,6 +393,7 @@ static void fuse_kill_requests(struct fuse_conn *fc, >> struct inode *inode, >> req->num_pages = 0; >> } >> } >> +EXPORT_SYMBOL_GPL(fuse_kill_requests); >> >> int fuse_invalidate_files(struct fuse_conn *fc, u64 nodeid) >> { >> @@ -442,6 +443,9 @@ int fuse_invalidate_files(struct fuse_conn *fc, u64 >> nodeid) >> } >> fuse_kill_requests(fc, inode, >main_iq.pending); >> fuse_kill_requests(fc, inode, >bg_queue); >> + if (fc->kio.op && fc->kio.op->kill_requests) >> + fc->kio.op->kill_requests(fc, inode); >> + >> wake_up(>page_waitq); /* readpage[s] can wait on fuse >> wb */ >> spin_unlock(>lock); >> >> diff --git a/fs/fuse/kio/pcs/fuse_io.c b/fs/fuse/kio/pcs/fuse_io.c >> index 61a2e7f1eac6..00a72c878efb 100644 >> --- a/fs/fuse/kio/pcs/fuse_io.c >> +++ b/fs/fuse/kio/pcs/fuse_io.c >> @@ -205,6 +205,7 @@ static void prepare_io_(struct pcs_fuse_req *r, unsigned >> short type, off_t offse >> static void ioreq_complete(pcs_api_iorequest_t *ioreq) >> { >> struct pcs_fuse_req *r = ioreq->datasource; >> + struct fuse_conn *fc = cl_from_req(r)->fc; >> >> BUG_ON(ioreq != >exec.io.req); >> >> @@ -217,6 +218,10 @@ static void ioreq_complete(pcs_api_iorequest_t *ioreq) >> r->req.out.h.error = 0; >> } >> >> + spin_lock(>lock); >> + list_del_init(>req.list); >> + spin_unlock(>lock); >> + >> switch (ioreq->type) { >> case PCS_REQ_T_READ: >> on_read_done(r, ioreq->size); >> diff --git a/fs/fuse/kio/pcs/pcs_cluster.c b/fs/fuse/kio/pcs/pcs_cluster.c >> index 5df263f01f98..6b8f38db5c40 100644 >> --- a/fs/fuse/kio/pcs/pcs_cluster.c >> +++ b/fs/fuse/kio/pcs/pcs_cluster.c >> @@ -608,6 +608,8 @@ int pcs_cluster_init(struct pcs_fuse_cluster *pfc, >> struct workqueue_struct *wq, >> pfc->cc.op.ireq_on_error = ireq_on_error_; >> pfc->cc.op.ireq_check_redo = ireq_check_redo_; >> >> + INIT_LIST_HEAD(>kio_queue); >> + >> return 0; >> } >> >> diff --git a/fs/fuse/kio/pcs/pcs_cluster.h b/fs/fuse/kio/pcs/pcs_cluster.h >> index 9c537cb43b30..8a3ae3244b80 100644 >> --- a/fs/fuse/kio/pcs/pcs_cluster.h >> +++ b/fs/fuse/kio/pcs/pcs_cluster.h >> @@ -32,6
Re: [Devel] [PATCH] fs/fuse kio: invalidate files for kio
Hello! Huh? We were going to get rid of fc->lock and definitely are not going to add new ones. It is exactly why it was not made in the first place. On Fri, Jan 18, 2019 at 4:44 PM Pavel Butsykin wrote: > > Make fuse_invalidate_files() work for kio. This is necessary to maintain > vstorage revoke in FPath mode. To do this, let's add a list of inflight kio > requests to be able to handle this list in fuse_invalidate_files(). The list > will also be useful to implement the full-featured .vstorage.info and > fuse_abort_conn() for kio. > > #VSTOR-19620 > > Signed-off-by: Pavel Butsykin > --- > fs/fuse/fuse_i.h | 4 > fs/fuse/inode.c| 8 ++-- > fs/fuse/kio/pcs/fuse_io.c | 5 + > fs/fuse/kio/pcs/pcs_cluster.c | 2 ++ > fs/fuse/kio/pcs/pcs_cluster.h | 1 + > fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 16 > 6 files changed, 34 insertions(+), 2 deletions(-) > > diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h > index 4c27bfa0e74d..0914940d6735 100644 > --- a/fs/fuse/fuse_i.h > +++ b/fs/fuse/fuse_i.h > @@ -528,6 +528,7 @@ struct fuse_kio_ops { > int (*file_open)(struct fuse_conn *fc, struct file *file, > struct inode *inode); > void (*inode_release)(struct fuse_inode *fi); > + void (*kill_requests)(struct fuse_conn *fc, struct inode *inode); > > }; > int fuse_register_kio(struct fuse_kio_ops *ops); > @@ -1107,4 +1108,7 @@ struct fuse_file *fuse_write_file(struct fuse_conn *fc, > struct fuse_inode *fi); > > void fuse_release_ff(struct inode *inode, struct fuse_file *ff); > > +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, > + struct list_head *req_list); > + > #endif /* _FS_FUSE_I_H */ > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c > index 34e52262d37e..cb275ff21991 100644 > --- a/fs/fuse/inode.c > +++ b/fs/fuse/inode.c > @@ -369,8 +369,8 @@ int fuse_reverse_inval_inode(struct super_block *sb, u64 > nodeid, > return 0; > } > > -static void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, > - struct list_head *req_list) > +void fuse_kill_requests(struct fuse_conn *fc, struct inode *inode, > + struct list_head *req_list) > { > struct fuse_req *req; > > @@ -393,6 +393,7 @@ static void fuse_kill_requests(struct fuse_conn *fc, > struct inode *inode, > req->num_pages = 0; > } > } > +EXPORT_SYMBOL_GPL(fuse_kill_requests); > > int fuse_invalidate_files(struct fuse_conn *fc, u64 nodeid) > { > @@ -442,6 +443,9 @@ int fuse_invalidate_files(struct fuse_conn *fc, u64 > nodeid) > } > fuse_kill_requests(fc, inode, >main_iq.pending); > fuse_kill_requests(fc, inode, >bg_queue); > + if (fc->kio.op && fc->kio.op->kill_requests) > + fc->kio.op->kill_requests(fc, inode); > + > wake_up(>page_waitq); /* readpage[s] can wait on fuse wb > */ > spin_unlock(>lock); > > diff --git a/fs/fuse/kio/pcs/fuse_io.c b/fs/fuse/kio/pcs/fuse_io.c > index 61a2e7f1eac6..00a72c878efb 100644 > --- a/fs/fuse/kio/pcs/fuse_io.c > +++ b/fs/fuse/kio/pcs/fuse_io.c > @@ -205,6 +205,7 @@ static void prepare_io_(struct pcs_fuse_req *r, unsigned > short type, off_t offse > static void ioreq_complete(pcs_api_iorequest_t *ioreq) > { > struct pcs_fuse_req *r = ioreq->datasource; > + struct fuse_conn *fc = cl_from_req(r)->fc; > > BUG_ON(ioreq != >exec.io.req); > > @@ -217,6 +218,10 @@ static void ioreq_complete(pcs_api_iorequest_t *ioreq) > r->req.out.h.error = 0; > } > > + spin_lock(>lock); > + list_del_init(>req.list); > + spin_unlock(>lock); > + > switch (ioreq->type) { > case PCS_REQ_T_READ: > on_read_done(r, ioreq->size); > diff --git a/fs/fuse/kio/pcs/pcs_cluster.c b/fs/fuse/kio/pcs/pcs_cluster.c > index 5df263f01f98..6b8f38db5c40 100644 > --- a/fs/fuse/kio/pcs/pcs_cluster.c > +++ b/fs/fuse/kio/pcs/pcs_cluster.c > @@ -608,6 +608,8 @@ int pcs_cluster_init(struct pcs_fuse_cluster *pfc, struct > workqueue_struct *wq, > pfc->cc.op.ireq_on_error = ireq_on_error_; > pfc->cc.op.ireq_check_redo = ireq_check_redo_; > > + INIT_LIST_HEAD(>kio_queue); > + > return 0; > } > > diff --git a/fs/fuse/kio/pcs/pcs_cluster.h b/fs/fuse/kio/pcs/pcs_cluster.h > index 9c537cb43b30..8a3ae3244b80 100644 > --- a/fs/fuse/kio/pcs/pcs_cluster.h > +++ b/fs/fuse/kio/pcs/pcs_cluster.h > @@ -32,6 +32,7 @@ struct pcs_fuse_req { > struct pcs_fuse_cluster { > struct pcs_cluster_core cc; > struct fuse_conn *fc; > + struct list_head kio_queue; > }; > > struct pcs_fuse_work { > diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c > b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c > index cdd4fe578128..1ca27b80b002 100644 > ---