|
@@ -1477,15 +1477,16 @@ cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
|
|
|
cifsi->server_eof = end_of_write;
|
|
|
}
|
|
|
|
|
|
-static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid,
|
|
|
- const char *write_data, size_t write_size,
|
|
|
- loff_t *poffset)
|
|
|
+static ssize_t
|
|
|
+cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data,
|
|
|
+ size_t write_size, loff_t *offset)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
unsigned int bytes_written = 0;
|
|
|
unsigned int total_written;
|
|
|
struct cifs_sb_info *cifs_sb;
|
|
|
- struct cifs_tcon *pTcon;
|
|
|
+ struct cifs_tcon *tcon;
|
|
|
+ struct TCP_Server_Info *server;
|
|
|
unsigned int xid;
|
|
|
struct dentry *dentry = open_file->dentry;
|
|
|
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);
|
|
|
|
|
|
cFYI(1, "write %zd bytes to offset %lld of %s", write_size,
|
|
|
- *poffset, dentry->d_name.name);
|
|
|
+ *offset, dentry->d_name.name);
|
|
|
+
|
|
|
+ tcon = tlink_tcon(open_file->tlink);
|
|
|
+ server = tcon->ses->server;
|
|
|
|
|
|
- pTcon = tlink_tcon(open_file->tlink);
|
|
|
+ if (!server->ops->sync_write)
|
|
|
+ return -ENOSYS;
|
|
|
|
|
|
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[1].iov_base = (char *)write_data + total_written;
|
|
|
iov[1].iov_len = len;
|
|
|
- io_parms.netfid = open_file->fid.netfid;
|
|
|
io_parms.pid = pid;
|
|
|
- io_parms.tcon = pTcon;
|
|
|
- io_parms.offset = *poffset;
|
|
|
+ io_parms.tcon = tcon;
|
|
|
+ io_parms.offset = *offset;
|
|
|
io_parms.length = len;
|
|
|
- rc = CIFSSMBWrite2(xid, &io_parms, &bytes_written, iov,
|
|
|
- 1, 0);
|
|
|
+ rc = server->ops->sync_write(xid, open_file, &io_parms,
|
|
|
+ &bytes_written, iov, 1);
|
|
|
}
|
|
|
if (rc || (bytes_written == 0)) {
|
|
|
if (total_written)
|
|
@@ -1539,18 +1543,18 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid,
|
|
|
}
|
|
|
} else {
|
|
|
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);
|
|
|
- *poffset += bytes_written;
|
|
|
+ *offset += bytes_written;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- cifs_stats_bytes_written(pTcon, total_written);
|
|
|
+ cifs_stats_bytes_written(tcon, total_written);
|
|
|
|
|
|
if (total_written > 0) {
|
|
|
spin_lock(&dentry->d_inode->i_lock);
|
|
|
- if (*poffset > dentry->d_inode->i_size)
|
|
|
- i_size_write(dentry->d_inode, *poffset);
|
|
|
+ if (*offset > dentry->d_inode->i_size)
|
|
|
+ i_size_write(dentry->d_inode, *offset);
|
|
|
spin_unlock(&dentry->d_inode->i_lock);
|
|
|
}
|
|
|
mark_inode_dirty_sync(dentry->d_inode);
|