Commit a975a2f2 authored by David Howells's avatar David Howells

cifs: Replace cifs_writedata with a wrapper around netfs_io_subrequest

Replace the cifs_writedata struct with the same wrapper around
netfs_io_subrequest that was used to replace cifs_readdata.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Steve French <sfrench@samba.org>
cc: Shyam Prasad N <nspmangalore@gmail.com>
cc: Rohith Surabattula <rohiths.msft@gmail.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: linux-cifs@vger.kernel.org
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
cc: linux-mm@kvack.org
parent 753b67eb
...@@ -269,7 +269,6 @@ struct cifs_fattr; ...@@ -269,7 +269,6 @@ struct cifs_fattr;
struct smb3_fs_context; struct smb3_fs_context;
struct cifs_fid; struct cifs_fid;
struct cifs_io_subrequest; struct cifs_io_subrequest;
struct cifs_writedata;
struct cifs_io_parms; struct cifs_io_parms;
struct cifs_search_info; struct cifs_search_info;
struct cifsInodeInfo; struct cifsInodeInfo;
...@@ -452,8 +451,7 @@ struct smb_version_operations { ...@@ -452,8 +451,7 @@ struct smb_version_operations {
/* async read from the server */ /* async read from the server */
int (*async_readv)(struct cifs_io_subrequest *); int (*async_readv)(struct cifs_io_subrequest *);
/* async write to the server */ /* async write to the server */
int (*async_writev)(struct cifs_writedata *, int (*async_writev)(struct cifs_io_subrequest *);
void (*release)(struct kref *));
/* sync read from the server */ /* sync read from the server */
int (*sync_read)(const unsigned int, struct cifs_fid *, int (*sync_read)(const unsigned int, struct cifs_fid *,
struct cifs_io_parms *, unsigned int *, char **, struct cifs_io_parms *, unsigned int *, char **,
...@@ -1508,36 +1506,18 @@ struct cifs_io_subrequest { ...@@ -1508,36 +1506,18 @@ struct cifs_io_subrequest {
#endif #endif
struct cifs_credits credits; struct cifs_credits credits;
// TODO: Remove following elements enum writeback_sync_modes sync_mode;
struct list_head list; bool uncached;
struct completion done; bool replay;
struct work_struct work; struct bio_vec *bv;
struct iov_iter iter;
__u64 offset;
unsigned int bytes;
};
/* asynchronous write support */ // TODO: Remove following elements
struct cifs_writedata {
struct kref refcount;
struct list_head list; struct list_head list;
struct completion done; struct completion done;
enum writeback_sync_modes sync_mode;
struct work_struct work; struct work_struct work;
struct cifsFileInfo *cfile;
struct cifs_aio_ctx *ctx;
struct iov_iter iter; struct iov_iter iter;
struct bio_vec *bv;
__u64 offset; __u64 offset;
pid_t pid;
unsigned int bytes; unsigned int bytes;
int result;
struct TCP_Server_Info *server;
#ifdef CONFIG_CIFS_SMB_DIRECT
struct smbd_mr *mr;
#endif
struct cifs_credits credits;
bool replay;
}; };
/* /*
......
...@@ -612,11 +612,19 @@ static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata) ...@@ -612,11 +612,19 @@ static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata)
int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_async_readv(struct cifs_io_subrequest *rdata);
int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid);
int cifs_async_writev(struct cifs_writedata *wdata, int cifs_async_writev(struct cifs_io_subrequest *wdata);
void (*release)(struct kref *kref));
void cifs_writev_complete(struct work_struct *work); void cifs_writev_complete(struct work_struct *work);
struct cifs_writedata *cifs_writedata_alloc(work_func_t complete); struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete);
void cifs_writedata_release(struct kref *refcount); void cifs_writedata_release(struct cifs_io_subrequest *rdata);
static inline void cifs_get_writedata(struct cifs_io_subrequest *wdata)
{
refcount_inc(&wdata->subreq.ref);
}
static inline void cifs_put_writedata(struct cifs_io_subrequest *wdata)
{
if (refcount_dec_and_test(&wdata->subreq.ref))
cifs_writedata_release(wdata);
}
int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
struct cifs_sb_info *cifs_sb, struct cifs_sb_info *cifs_sb,
const unsigned char *path, char *pbuf, const unsigned char *path, char *pbuf,
......
...@@ -1612,7 +1612,7 @@ CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms, ...@@ -1612,7 +1612,7 @@ CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms,
static void static void
cifs_writev_callback(struct mid_q_entry *mid) cifs_writev_callback(struct mid_q_entry *mid)
{ {
struct cifs_writedata *wdata = mid->callback_data; struct cifs_io_subrequest *wdata = mid->callback_data;
struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
unsigned int written; unsigned int written;
WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf;
...@@ -1657,8 +1657,7 @@ cifs_writev_callback(struct mid_q_entry *mid) ...@@ -1657,8 +1657,7 @@ cifs_writev_callback(struct mid_q_entry *mid)
/* cifs_async_writev - send an async write, and set up mid to handle result */ /* cifs_async_writev - send an async write, and set up mid to handle result */
int int
cifs_async_writev(struct cifs_writedata *wdata, cifs_async_writev(struct cifs_io_subrequest *wdata)
void (*release)(struct kref *kref))
{ {
int rc = -EACCES; int rc = -EACCES;
WRITE_REQ *smb = NULL; WRITE_REQ *smb = NULL;
...@@ -1725,14 +1724,14 @@ cifs_async_writev(struct cifs_writedata *wdata, ...@@ -1725,14 +1724,14 @@ cifs_async_writev(struct cifs_writedata *wdata,
iov[1].iov_len += 4; /* pad bigger by four bytes */ iov[1].iov_len += 4; /* pad bigger by four bytes */
} }
kref_get(&wdata->refcount); cifs_get_writedata(wdata);
rc = cifs_call_async(tcon->ses->server, &rqst, NULL, rc = cifs_call_async(tcon->ses->server, &rqst, NULL,
cifs_writev_callback, NULL, wdata, 0, NULL); cifs_writev_callback, NULL, wdata, 0, NULL);
if (rc == 0) if (rc == 0)
cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); cifs_stats_inc(&tcon->stats.cifs_stats.num_writes);
else else
kref_put(&wdata->refcount, release); cifs_put_writedata(wdata);
async_writev_out: async_writev_out:
cifs_small_buf_release(smb); cifs_small_buf_release(smb);
......
...@@ -2510,10 +2510,10 @@ cifs_get_readable_path(struct cifs_tcon *tcon, const char *name, ...@@ -2510,10 +2510,10 @@ cifs_get_readable_path(struct cifs_tcon *tcon, const char *name,
} }
void void
cifs_writedata_release(struct kref *refcount) cifs_writedata_release(struct cifs_io_subrequest *wdata)
{ {
struct cifs_writedata *wdata = container_of(refcount, if (wdata->uncached)
struct cifs_writedata, refcount); kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release);
#ifdef CONFIG_CIFS_SMB_DIRECT #ifdef CONFIG_CIFS_SMB_DIRECT
if (wdata->mr) { if (wdata->mr) {
smbd_deregister_mr(wdata->mr); smbd_deregister_mr(wdata->mr);
...@@ -2532,7 +2532,7 @@ cifs_writedata_release(struct kref *refcount) ...@@ -2532,7 +2532,7 @@ cifs_writedata_release(struct kref *refcount)
* possible that the page was redirtied so re-clean the page. * possible that the page was redirtied so re-clean the page.
*/ */
static void static void
cifs_writev_requeue(struct cifs_writedata *wdata) cifs_writev_requeue(struct cifs_io_subrequest *wdata)
{ {
int rc = 0; int rc = 0;
struct inode *inode = d_inode(wdata->cfile->dentry); struct inode *inode = d_inode(wdata->cfile->dentry);
...@@ -2542,7 +2542,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) ...@@ -2542,7 +2542,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata)
server = tlink_tcon(wdata->cfile->tlink)->ses->server; server = tlink_tcon(wdata->cfile->tlink)->ses->server;
do { do {
struct cifs_writedata *wdata2; struct cifs_io_subrequest *wdata2;
unsigned int wsize, cur_len; unsigned int wsize, cur_len;
wsize = server->ops->wp_retry_size(inode); wsize = server->ops->wp_retry_size(inode);
...@@ -2565,7 +2565,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) ...@@ -2565,7 +2565,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata)
wdata2->sync_mode = wdata->sync_mode; wdata2->sync_mode = wdata->sync_mode;
wdata2->offset = fpos; wdata2->offset = fpos;
wdata2->bytes = cur_len; wdata2->bytes = cur_len;
wdata2->iter = wdata->iter; wdata2->iter = wdata->iter;
iov_iter_advance(&wdata2->iter, fpos - wdata->offset); iov_iter_advance(&wdata2->iter, fpos - wdata->offset);
iov_iter_truncate(&wdata2->iter, wdata2->bytes); iov_iter_truncate(&wdata2->iter, wdata2->bytes);
...@@ -2587,11 +2587,10 @@ cifs_writev_requeue(struct cifs_writedata *wdata) ...@@ -2587,11 +2587,10 @@ cifs_writev_requeue(struct cifs_writedata *wdata)
rc = -EBADF; rc = -EBADF;
} else { } else {
wdata2->pid = wdata2->cfile->pid; wdata2->pid = wdata2->cfile->pid;
rc = server->ops->async_writev(wdata2, rc = server->ops->async_writev(wdata2);
cifs_writedata_release);
} }
kref_put(&wdata2->refcount, cifs_writedata_release); cifs_put_writedata(wdata2);
if (rc) { if (rc) {
if (is_retryable_error(rc)) if (is_retryable_error(rc))
continue; continue;
...@@ -2610,14 +2609,14 @@ cifs_writev_requeue(struct cifs_writedata *wdata) ...@@ -2610,14 +2609,14 @@ cifs_writev_requeue(struct cifs_writedata *wdata)
if (rc != 0 && !is_retryable_error(rc)) if (rc != 0 && !is_retryable_error(rc))
mapping_set_error(inode->i_mapping, rc); mapping_set_error(inode->i_mapping, rc);
kref_put(&wdata->refcount, cifs_writedata_release); cifs_put_writedata(wdata);
} }
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_io_subrequest *wdata = container_of(work,
struct cifs_writedata, work); struct cifs_io_subrequest, work);
struct inode *inode = d_inode(wdata->cfile->dentry); struct inode *inode = d_inode(wdata->cfile->dentry);
if (wdata->result == 0) { if (wdata->result == 0) {
...@@ -2638,16 +2637,16 @@ cifs_writev_complete(struct work_struct *work) ...@@ -2638,16 +2637,16 @@ cifs_writev_complete(struct work_struct *work)
if (wdata->result != -EAGAIN) if (wdata->result != -EAGAIN)
mapping_set_error(inode->i_mapping, wdata->result); mapping_set_error(inode->i_mapping, wdata->result);
kref_put(&wdata->refcount, cifs_writedata_release); cifs_put_writedata(wdata);
} }
struct cifs_writedata *cifs_writedata_alloc(work_func_t complete) struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete)
{ {
struct cifs_writedata *wdata; struct cifs_io_subrequest *wdata;
wdata = kzalloc(sizeof(*wdata), GFP_NOFS); wdata = kzalloc(sizeof(*wdata), GFP_NOFS);
if (wdata != NULL) { if (wdata != NULL) {
kref_init(&wdata->refcount); refcount_set(&wdata->subreq.ref, 1);
INIT_LIST_HEAD(&wdata->list); INIT_LIST_HEAD(&wdata->list);
init_completion(&wdata->done); init_completion(&wdata->done);
INIT_WORK(&wdata->work, complete); INIT_WORK(&wdata->work, complete);
...@@ -2778,7 +2777,7 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, ...@@ -2778,7 +2777,7 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping,
{ {
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct TCP_Server_Info *server; struct TCP_Server_Info *server;
struct cifs_writedata *wdata; struct cifs_io_subrequest *wdata;
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
struct cifs_credits credits_on_stack; struct cifs_credits credits_on_stack;
struct cifs_credits *credits = &credits_on_stack; struct cifs_credits *credits = &credits_on_stack;
...@@ -2871,10 +2870,9 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, ...@@ -2871,10 +2870,9 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping,
if (wdata->cfile->invalidHandle) if (wdata->cfile->invalidHandle)
rc = -EAGAIN; rc = -EAGAIN;
else else
rc = wdata->server->ops->async_writev(wdata, rc = wdata->server->ops->async_writev(wdata);
cifs_writedata_release);
if (rc >= 0) { if (rc >= 0) {
kref_put(&wdata->refcount, cifs_writedata_release); cifs_put_writedata(wdata);
goto err_close; goto err_close;
} }
} else { } else {
...@@ -2884,7 +2882,7 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping, ...@@ -2884,7 +2882,7 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping,
} }
err_wdata: err_wdata:
kref_put(&wdata->refcount, cifs_writedata_release); cifs_put_writedata(wdata);
err_uncredit: err_uncredit:
add_credits_and_wake_if(server, credits, 0); add_credits_and_wake_if(server, credits, 0);
err_close: err_close:
...@@ -3261,23 +3259,13 @@ int cifs_flush(struct file *file, fl_owner_t id) ...@@ -3261,23 +3259,13 @@ int cifs_flush(struct file *file, fl_owner_t id)
return rc; return rc;
} }
static void
cifs_uncached_writedata_release(struct kref *refcount)
{
struct cifs_writedata *wdata = container_of(refcount,
struct cifs_writedata, refcount);
kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release);
cifs_writedata_release(refcount);
}
static void collect_uncached_write_data(struct cifs_aio_ctx *ctx); static void collect_uncached_write_data(struct cifs_aio_ctx *ctx);
static void static void
cifs_uncached_writev_complete(struct work_struct *work) cifs_uncached_writev_complete(struct work_struct *work)
{ {
struct cifs_writedata *wdata = container_of(work, struct cifs_io_subrequest *wdata = container_of(work,
struct cifs_writedata, work); struct cifs_io_subrequest, work);
struct inode *inode = d_inode(wdata->cfile->dentry); struct inode *inode = d_inode(wdata->cfile->dentry);
struct cifsInodeInfo *cifsi = CIFS_I(inode); struct cifsInodeInfo *cifsi = CIFS_I(inode);
...@@ -3290,11 +3278,11 @@ cifs_uncached_writev_complete(struct work_struct *work) ...@@ -3290,11 +3278,11 @@ cifs_uncached_writev_complete(struct work_struct *work)
complete(&wdata->done); complete(&wdata->done);
collect_uncached_write_data(wdata->ctx); collect_uncached_write_data(wdata->ctx);
/* the below call can possibly free the last ref to aio ctx */ /* the below call can possibly free the last ref to aio ctx */
kref_put(&wdata->refcount, cifs_uncached_writedata_release); cifs_put_writedata(wdata);
} }
static int static int
cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list, cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdata_list,
struct cifs_aio_ctx *ctx) struct cifs_aio_ctx *ctx)
{ {
unsigned int wsize; unsigned int wsize;
...@@ -3344,8 +3332,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list, ...@@ -3344,8 +3332,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list,
wdata->mr = NULL; wdata->mr = NULL;
} }
#endif #endif
rc = server->ops->async_writev(wdata, rc = server->ops->async_writev(wdata);
cifs_uncached_writedata_release);
} }
} }
...@@ -3360,7 +3347,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list, ...@@ -3360,7 +3347,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_list,
} while (rc == -EAGAIN); } while (rc == -EAGAIN);
fail: fail:
kref_put(&wdata->refcount, cifs_uncached_writedata_release); cifs_put_writedata(wdata);
return rc; return rc;
} }
...@@ -3412,7 +3399,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, ...@@ -3412,7 +3399,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from,
{ {
int rc = 0; int rc = 0;
size_t cur_len, max_len; size_t cur_len, max_len;
struct cifs_writedata *wdata; struct cifs_io_subrequest *wdata;
pid_t pid; pid_t pid;
struct TCP_Server_Info *server; struct TCP_Server_Info *server;
unsigned int xid, max_segs = INT_MAX; unsigned int xid, max_segs = INT_MAX;
...@@ -3476,6 +3463,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, ...@@ -3476,6 +3463,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from,
break; break;
} }
wdata->uncached = true;
wdata->sync_mode = WB_SYNC_ALL; wdata->sync_mode = WB_SYNC_ALL;
wdata->offset = (__u64)fpos; wdata->offset = (__u64)fpos;
wdata->cfile = cifsFileInfo_get(open_file); wdata->cfile = cifsFileInfo_get(open_file);
...@@ -3495,14 +3483,12 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, ...@@ -3495,14 +3483,12 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from,
if (wdata->cfile->invalidHandle) if (wdata->cfile->invalidHandle)
rc = -EAGAIN; rc = -EAGAIN;
else else
rc = server->ops->async_writev(wdata, rc = server->ops->async_writev(wdata);
cifs_uncached_writedata_release);
} }
if (rc) { if (rc) {
add_credits_and_wake_if(server, &wdata->credits, 0); add_credits_and_wake_if(server, &wdata->credits, 0);
kref_put(&wdata->refcount, cifs_put_writedata(wdata);
cifs_uncached_writedata_release);
if (rc == -EAGAIN) if (rc == -EAGAIN)
continue; continue;
break; break;
...@@ -3520,7 +3506,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, ...@@ -3520,7 +3506,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from,
static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) static void collect_uncached_write_data(struct cifs_aio_ctx *ctx)
{ {
struct cifs_writedata *wdata, *tmp; struct cifs_io_subrequest *wdata, *tmp;
struct cifs_tcon *tcon; struct cifs_tcon *tcon;
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
struct dentry *dentry = ctx->cfile->dentry; struct dentry *dentry = ctx->cfile->dentry;
...@@ -3575,8 +3561,7 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) ...@@ -3575,8 +3561,7 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx)
ctx->cfile, cifs_sb, &tmp_list, ctx->cfile, cifs_sb, &tmp_list,
ctx); ctx);
kref_put(&wdata->refcount, cifs_put_writedata(wdata);
cifs_uncached_writedata_release);
} }
list_splice(&tmp_list, &ctx->list); list_splice(&tmp_list, &ctx->list);
...@@ -3584,7 +3569,7 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) ...@@ -3584,7 +3569,7 @@ static void collect_uncached_write_data(struct cifs_aio_ctx *ctx)
} }
} }
list_del_init(&wdata->list); list_del_init(&wdata->list);
kref_put(&wdata->refcount, cifs_uncached_writedata_release); cifs_put_writedata(wdata);
} }
cifs_stats_bytes_written(tcon, ctx->total_len); cifs_stats_bytes_written(tcon, ctx->total_len);
......
...@@ -4737,7 +4737,7 @@ SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms, ...@@ -4737,7 +4737,7 @@ SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms,
static void static void
smb2_writev_callback(struct mid_q_entry *mid) smb2_writev_callback(struct mid_q_entry *mid)
{ {
struct cifs_writedata *wdata = mid->callback_data; struct cifs_io_subrequest *wdata = mid->callback_data;
struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
struct TCP_Server_Info *server = wdata->server; struct TCP_Server_Info *server = wdata->server;
unsigned int written; unsigned int written;
...@@ -4818,8 +4818,7 @@ smb2_writev_callback(struct mid_q_entry *mid) ...@@ -4818,8 +4818,7 @@ smb2_writev_callback(struct mid_q_entry *mid)
/* smb2_async_writev - send an async write, and set up mid to handle result */ /* smb2_async_writev - send an async write, and set up mid to handle result */
int int
smb2_async_writev(struct cifs_writedata *wdata, smb2_async_writev(struct cifs_io_subrequest *wdata)
void (*release)(struct kref *kref))
{ {
int rc = -EACCES, flags = 0; int rc = -EACCES, flags = 0;
struct smb2_write_req *req = NULL; struct smb2_write_req *req = NULL;
...@@ -4953,7 +4952,7 @@ smb2_async_writev(struct cifs_writedata *wdata, ...@@ -4953,7 +4952,7 @@ smb2_async_writev(struct cifs_writedata *wdata,
flags |= CIFS_HAS_CREDITS; flags |= CIFS_HAS_CREDITS;
} }
kref_get(&wdata->refcount); cifs_get_writedata(wdata);
rc = cifs_call_async(server, &rqst, NULL, smb2_writev_callback, NULL, rc = cifs_call_async(server, &rqst, NULL, smb2_writev_callback, NULL,
wdata, flags, &wdata->credits); wdata, flags, &wdata->credits);
...@@ -4965,7 +4964,7 @@ smb2_async_writev(struct cifs_writedata *wdata, ...@@ -4965,7 +4964,7 @@ smb2_async_writev(struct cifs_writedata *wdata,
io_parms->offset, io_parms->offset,
io_parms->length, io_parms->length,
rc); rc);
kref_put(&wdata->refcount, release); cifs_put_writedata(wdata);
cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); cifs_stats_fail_inc(tcon, SMB2_WRITE_HE);
} }
......
...@@ -213,8 +213,7 @@ extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -213,8 +213,7 @@ extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon,
extern int smb2_async_readv(struct cifs_io_subrequest *rdata); extern int smb2_async_readv(struct cifs_io_subrequest *rdata);
extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms, extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms,
unsigned int *nbytes, char **buf, int *buf_type); unsigned int *nbytes, char **buf, int *buf_type);
extern int smb2_async_writev(struct cifs_writedata *wdata, extern int smb2_async_writev(struct cifs_io_subrequest *wdata);
void (*release)(struct kref *kref));
extern int SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms, extern int SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms,
unsigned int *nbytes, struct kvec *iov, int n_vec); unsigned int *nbytes, struct kvec *iov, int n_vec);
extern int SMB2_echo(struct TCP_Server_Info *server); extern int SMB2_echo(struct TCP_Server_Info *server);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment