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:
Jeff Layton 2012-03-23 14:40:55 -04:00
parent fe5f5d2e90
commit c2e8764009
3 changed files with 8 additions and 5 deletions

View file

@ -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 */

View file

@ -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;

View file

@ -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;