CIFS: Move writepage to ops struct
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
d8e050398d
commit
ba9ad7257a
|
@ -291,6 +291,10 @@ struct smb_version_operations {
|
||||||
int (*sync_read)(const unsigned int, struct cifsFileInfo *,
|
int (*sync_read)(const unsigned int, struct cifsFileInfo *,
|
||||||
struct cifs_io_parms *, unsigned int *, char **,
|
struct cifs_io_parms *, unsigned int *, char **,
|
||||||
int *);
|
int *);
|
||||||
|
/* sync write to the server */
|
||||||
|
int (*sync_write)(const unsigned int, struct cifsFileInfo *,
|
||||||
|
struct cifs_io_parms *, unsigned int *, struct kvec *,
|
||||||
|
unsigned long);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct smb_version_values {
|
struct smb_version_values {
|
||||||
|
|
|
@ -369,8 +369,7 @@ extern int CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||||
unsigned int *nbytes, const char *buf,
|
unsigned int *nbytes, const char *buf,
|
||||||
const char __user *ubuf, const int long_op);
|
const char __user *ubuf, const int long_op);
|
||||||
extern int CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
extern int CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||||
unsigned int *nbytes, struct kvec *iov, const int nvec,
|
unsigned int *nbytes, struct kvec *iov, const int nvec);
|
||||||
const int long_op);
|
|
||||||
extern int CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon,
|
extern int CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon,
|
||||||
const char *search_name, __u64 *inode_number,
|
const char *search_name, __u64 *inode_number,
|
||||||
const struct nls_table *nls_codepage,
|
const struct nls_table *nls_codepage,
|
||||||
|
|
|
@ -2123,8 +2123,7 @@ async_writev_out:
|
||||||
|
|
||||||
int
|
int
|
||||||
CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
CIFSSMBWrite2(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)
|
||||||
const int long_op)
|
|
||||||
{
|
{
|
||||||
int rc = -EACCES;
|
int rc = -EACCES;
|
||||||
WRITE_REQ *pSMB = NULL;
|
WRITE_REQ *pSMB = NULL;
|
||||||
|
@ -2195,8 +2194,7 @@ CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms,
|
||||||
iov[0].iov_len = smb_hdr_len + 8;
|
iov[0].iov_len = smb_hdr_len + 8;
|
||||||
|
|
||||||
|
|
||||||
rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type,
|
rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type, 0);
|
||||||
long_op);
|
|
||||||
cifs_stats_inc(&tcon->stats.cifs_stats.num_writes);
|
cifs_stats_inc(&tcon->stats.cifs_stats.num_writes);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
cFYI(1, "Send error Write2 = %d", rc);
|
cFYI(1, "Send error Write2 = %d", rc);
|
||||||
|
|
|
@ -1477,15 +1477,16 @@ cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
|
||||||
cifsi->server_eof = end_of_write;
|
cifsi->server_eof = end_of_write;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid,
|
static ssize_t
|
||||||
const char *write_data, size_t write_size,
|
cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data,
|
||||||
loff_t *poffset)
|
size_t write_size, loff_t *offset)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
unsigned int bytes_written = 0;
|
unsigned int bytes_written = 0;
|
||||||
unsigned int total_written;
|
unsigned int total_written;
|
||||||
struct cifs_sb_info *cifs_sb;
|
struct cifs_sb_info *cifs_sb;
|
||||||
struct cifs_tcon *pTcon;
|
struct cifs_tcon *tcon;
|
||||||
|
struct TCP_Server_Info *server;
|
||||||
unsigned int xid;
|
unsigned int xid;
|
||||||
struct dentry *dentry = open_file->dentry;
|
struct dentry *dentry = open_file->dentry;
|
||||||
struct cifsInodeInfo *cifsi = CIFS_I(dentry->d_inode);
|
struct cifsInodeInfo *cifsi = CIFS_I(dentry->d_inode);
|
||||||
|
@ -1494,9 +1495,13 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid,
|
||||||
cifs_sb = CIFS_SB(dentry->d_sb);
|
cifs_sb = CIFS_SB(dentry->d_sb);
|
||||||
|
|
||||||
cFYI(1, "write %zd bytes to offset %lld of %s", write_size,
|
cFYI(1, "write %zd bytes to offset %lld of %s", write_size,
|
||||||
*poffset, dentry->d_name.name);
|
*offset, dentry->d_name.name);
|
||||||
|
|
||||||
pTcon = tlink_tcon(open_file->tlink);
|
tcon = tlink_tcon(open_file->tlink);
|
||||||
|
server = tcon->ses->server;
|
||||||
|
|
||||||
|
if (!server->ops->sync_write)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
xid = get_xid();
|
xid = get_xid();
|
||||||
|
|
||||||
|
@ -1522,13 +1527,12 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid,
|
||||||
/* iov[0] is reserved for smb header */
|
/* iov[0] is reserved for smb header */
|
||||||
iov[1].iov_base = (char *)write_data + total_written;
|
iov[1].iov_base = (char *)write_data + total_written;
|
||||||
iov[1].iov_len = len;
|
iov[1].iov_len = len;
|
||||||
io_parms.netfid = open_file->fid.netfid;
|
|
||||||
io_parms.pid = pid;
|
io_parms.pid = pid;
|
||||||
io_parms.tcon = pTcon;
|
io_parms.tcon = tcon;
|
||||||
io_parms.offset = *poffset;
|
io_parms.offset = *offset;
|
||||||
io_parms.length = len;
|
io_parms.length = len;
|
||||||
rc = CIFSSMBWrite2(xid, &io_parms, &bytes_written, iov,
|
rc = server->ops->sync_write(xid, open_file, &io_parms,
|
||||||
1, 0);
|
&bytes_written, iov, 1);
|
||||||
}
|
}
|
||||||
if (rc || (bytes_written == 0)) {
|
if (rc || (bytes_written == 0)) {
|
||||||
if (total_written)
|
if (total_written)
|
||||||
|
@ -1539,18 +1543,18 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
spin_lock(&dentry->d_inode->i_lock);
|
spin_lock(&dentry->d_inode->i_lock);
|
||||||
cifs_update_eof(cifsi, *poffset, bytes_written);
|
cifs_update_eof(cifsi, *offset, bytes_written);
|
||||||
spin_unlock(&dentry->d_inode->i_lock);
|
spin_unlock(&dentry->d_inode->i_lock);
|
||||||
*poffset += bytes_written;
|
*offset += bytes_written;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cifs_stats_bytes_written(pTcon, total_written);
|
cifs_stats_bytes_written(tcon, total_written);
|
||||||
|
|
||||||
if (total_written > 0) {
|
if (total_written > 0) {
|
||||||
spin_lock(&dentry->d_inode->i_lock);
|
spin_lock(&dentry->d_inode->i_lock);
|
||||||
if (*poffset > dentry->d_inode->i_size)
|
if (*offset > dentry->d_inode->i_size)
|
||||||
i_size_write(dentry->d_inode, *poffset);
|
i_size_write(dentry->d_inode, *offset);
|
||||||
spin_unlock(&dentry->d_inode->i_lock);
|
spin_unlock(&dentry->d_inode->i_lock);
|
||||||
}
|
}
|
||||||
mark_inode_dirty_sync(dentry->d_inode);
|
mark_inode_dirty_sync(dentry->d_inode);
|
||||||
|
|
|
@ -748,6 +748,16 @@ cifs_sync_read(const unsigned int xid, struct cifsFileInfo *cfile,
|
||||||
return CIFSSMBRead(xid, parms, bytes_read, buf, buf_type);
|
return CIFSSMBRead(xid, parms, bytes_read, buf, buf_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cifs_sync_write(const unsigned int xid, struct cifsFileInfo *cfile,
|
||||||
|
struct cifs_io_parms *parms, unsigned int *written,
|
||||||
|
struct kvec *iov, unsigned long nr_segs)
|
||||||
|
{
|
||||||
|
|
||||||
|
parms->netfid = cfile->fid.netfid;
|
||||||
|
return CIFSSMBWrite2(xid, parms, written, iov, nr_segs);
|
||||||
|
}
|
||||||
|
|
||||||
struct smb_version_operations smb1_operations = {
|
struct smb_version_operations smb1_operations = {
|
||||||
.send_cancel = send_nt_cancel,
|
.send_cancel = send_nt_cancel,
|
||||||
.compare_fids = cifs_compare_fids,
|
.compare_fids = cifs_compare_fids,
|
||||||
|
@ -797,6 +807,7 @@ struct smb_version_operations smb1_operations = {
|
||||||
.async_readv = cifs_async_readv,
|
.async_readv = cifs_async_readv,
|
||||||
.async_writev = cifs_async_writev,
|
.async_writev = cifs_async_writev,
|
||||||
.sync_read = cifs_sync_read,
|
.sync_read = cifs_sync_read,
|
||||||
|
.sync_write = cifs_sync_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct smb_version_values smb1_values = {
|
struct smb_version_values smb1_values = {
|
||||||
|
|
Loading…
Reference in New Issue