cifs: allow caller to specify completion op when allocating writedata
We'll need a different set of write completion ops when not writing out of the pagecache. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Pavel Shilovsky <piastry@etersoft.ru>
This commit is contained in:
parent
fe5f5d2e90
commit
c2e8764009
3 changed files with 8 additions and 5 deletions
|
@ -495,7 +495,9 @@ struct cifs_writedata {
|
||||||
};
|
};
|
||||||
|
|
||||||
int cifs_async_writev(struct cifs_writedata *wdata);
|
int cifs_async_writev(struct cifs_writedata *wdata);
|
||||||
struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages);
|
void cifs_writev_complete(struct work_struct *work);
|
||||||
|
struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages,
|
||||||
|
work_func_t complete);
|
||||||
void cifs_writedata_release(struct kref *refcount);
|
void cifs_writedata_release(struct kref *refcount);
|
||||||
|
|
||||||
#endif /* _CIFSPROTO_H */
|
#endif /* _CIFSPROTO_H */
|
||||||
|
|
|
@ -2035,7 +2035,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata)
|
||||||
kref_put(&wdata->refcount, cifs_writedata_release);
|
kref_put(&wdata->refcount, cifs_writedata_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
cifs_writev_complete(struct work_struct *work)
|
cifs_writev_complete(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct cifs_writedata *wdata = container_of(work,
|
struct cifs_writedata *wdata = container_of(work,
|
||||||
|
@ -2065,7 +2065,7 @@ cifs_writev_complete(struct work_struct *work)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cifs_writedata *
|
struct cifs_writedata *
|
||||||
cifs_writedata_alloc(unsigned int nr_pages)
|
cifs_writedata_alloc(unsigned int nr_pages, work_func_t complete)
|
||||||
{
|
{
|
||||||
struct cifs_writedata *wdata;
|
struct cifs_writedata *wdata;
|
||||||
|
|
||||||
|
@ -2079,7 +2079,7 @@ cifs_writedata_alloc(unsigned int nr_pages)
|
||||||
wdata = kzalloc(sizeof(*wdata) +
|
wdata = kzalloc(sizeof(*wdata) +
|
||||||
sizeof(struct page *) * (nr_pages - 1), GFP_NOFS);
|
sizeof(struct page *) * (nr_pages - 1), GFP_NOFS);
|
||||||
if (wdata != NULL) {
|
if (wdata != NULL) {
|
||||||
INIT_WORK(&wdata->work, cifs_writev_complete);
|
INIT_WORK(&wdata->work, complete);
|
||||||
kref_init(&wdata->refcount);
|
kref_init(&wdata->refcount);
|
||||||
}
|
}
|
||||||
return wdata;
|
return wdata;
|
||||||
|
|
|
@ -1684,7 +1684,8 @@ retry:
|
||||||
tofind = min((cifs_sb->wsize / PAGE_CACHE_SIZE) - 1,
|
tofind = min((cifs_sb->wsize / PAGE_CACHE_SIZE) - 1,
|
||||||
end - index) + 1;
|
end - index) + 1;
|
||||||
|
|
||||||
wdata = cifs_writedata_alloc((unsigned int)tofind);
|
wdata = cifs_writedata_alloc((unsigned int)tofind,
|
||||||
|
cifs_writev_complete);
|
||||||
if (!wdata) {
|
if (!wdata) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue