2011/5/2 Jeff Layton <jlayton@xxxxxxxxxxxxxxx>: > On Thu, 21 Apr 2011 17:26:34 +0400 > Pavel Shilovsky <piastry@xxxxxxxxxxx> wrote: > >> We need it to make write work with mandatory locking style because >> we can fail when kernel need to flush dirty pages and there is a lock >> held by process who opened file. >> >> Signed-off-by: Pavel Shilovsky <piastry@xxxxxxxxxxx> >> --- >> fs/cifs/cifsproto.h | 7 ++++--- >> fs/cifs/cifssmb.c | 12 ++++++++---- >> fs/cifs/file.c | 20 +++++++++++--------- >> 3 files changed, 23 insertions(+), 16 deletions(-) >> >> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h >> index 76c4dc7..a2eb860 100644 >> --- a/fs/cifs/cifsproto.h >> +++ b/fs/cifs/cifsproto.h >> @@ -344,9 +344,10 @@ extern int CIFSSMBWrite(const int xid, struct cifs_tcon *tcon, >> const char *buf, const char __user *ubuf, >> const int long_op); >> extern int CIFSSMBWrite2(const int xid, struct cifs_tcon *tcon, >> - const int netfid, const unsigned int count, >> - const __u64 offset, unsigned int *nbytes, >> - struct kvec *iov, const int nvec, const int long_op); >> + const int netfid, const __u32 netpid, >> + const unsigned int count, const __u64 offset, >> + unsigned int *nbytes, struct kvec *iov, const int nvec, >> + const int long_op); >> extern int CIFSGetSrvInodeNumber(const int xid, struct cifs_tcon *tcon, >> const unsigned char *searchName, __u64 *inode_number, >> const struct nls_table *nls_codepage, >> diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c >> index 3291770..17d1cbf 100644 >> --- a/fs/cifs/cifssmb.c >> +++ b/fs/cifs/cifssmb.c >> @@ -1603,10 +1603,10 @@ CIFSSMBWrite(const int xid, struct cifs_tcon *tcon, >> } >> >> int >> -CIFSSMBWrite2(const int xid, struct cifs_tcon *tcon, >> - const int netfid, const unsigned int count, >> - const __u64 offset, unsigned int *nbytes, struct kvec *iov, >> - int n_vec, const int long_op) >> +CIFSSMBWrite2(const int xid, struct cifs_tcon *tcon, const int netfid, >> + const __u32 netpid, const unsigned int count, const __u64 offset, >> + unsigned int *nbytes, struct kvec *iov, int n_vec, >> + const int long_op) > > Bleh, this argument list is getting to be huge. Some of these could be > dropped (specifically, the tcon, netfid, and netpid) if you passed in > the cifsFileInfo pointer instead. Is there any reason not to do that > here? > I agree - it is huge even without my patch. We have a lot of places like that in cifs code - so, I can only guess it was an idea to give CIFSSMB* functions all arguments as separate fields. If we change it we should change all calls like that and it should be separate patch. Cleanup all these calls is a good idea for next patch, I think, not for this one. >> { >> int rc = -EACCES; >> WRITE_REQ *pSMB = NULL; >> @@ -1630,6 +1630,10 @@ CIFSSMBWrite2(const int xid, struct cifs_tcon *tcon, >> rc = small_smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **) &pSMB); >> if (rc) >> return rc; >> + >> + pSMB->hdr.Pid = cpu_to_le16((__u16)netpid); >> + pSMB->hdr.PidHigh = cpu_to_le16((__u16)(netpid >> 16)); >> + >> /* tcon and ses pointer are checked in smb_init */ >> if (tcon->ses->server == NULL) >> return -ECONNABORTED; >> diff --git a/fs/cifs/file.c b/fs/cifs/file.c >> index 9c7f83f..838f06c 100644 >> --- a/fs/cifs/file.c >> +++ b/fs/cifs/file.c >> @@ -857,7 +857,7 @@ cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset, >> cifsi->server_eof = end_of_write; >> } >> >> -static ssize_t cifs_write(struct cifsFileInfo *open_file, >> +static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 netpid, >> const char *write_data, size_t write_size, >> loff_t *poffset) >> { >> @@ -901,8 +901,9 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, >> /* iov[0] is reserved for smb header */ >> iov[1].iov_base = (char *)write_data + total_written; >> iov[1].iov_len = len; >> - rc = CIFSSMBWrite2(xid, pTcon, open_file->netfid, len, >> - *poffset, &bytes_written, iov, 1, 0); >> + rc = CIFSSMBWrite2(xid, pTcon, open_file->netfid, >> + netpid, len, *poffset, >> + &bytes_written, iov, 1, 0); >> } >> if (rc || (bytes_written == 0)) { >> if (total_written) >> @@ -1071,8 +1072,8 @@ static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to) >> >> open_file = find_writable_file(CIFS_I(mapping->host), false); >> if (open_file) { >> - bytes_written = cifs_write(open_file, write_data, >> - to - from, &offset); >> + bytes_written = cifs_write(open_file, open_file->pid, >> + write_data, to - from, &offset); >> cifsFileInfo_put(open_file); >> /* Does mm or vfs already set times? */ >> inode->i_atime = inode->i_mtime = current_fs_time(inode->i_sb); >> @@ -1252,6 +1253,7 @@ retry_write: >> rc = -EBADF; >> } else { >> rc = CIFSSMBWrite2(xid, tcon, open_file->netfid, >> + open_file->pid, >> bytes_to_write, offset, >> &bytes_written, iov, n_iov, >> 0); >> @@ -1391,8 +1393,8 @@ static int cifs_write_end(struct file *file, struct address_space *mapping, >> /* BB check if anything else missing out of ppw >> such as updating last write time */ >> page_data = kmap(page); >> - rc = cifs_write(file->private_data, page_data + offset, >> - copied, &pos); >> + rc = cifs_write(file->private_data, current->tgid, >> + page_data + offset, copied, &pos); >> /* if (rc < 0) should we set writebehind rc? */ >> kunmap(page); >> >> @@ -1625,8 +1627,8 @@ cifs_iovec_write(struct file *file, const struct iovec *iov, >> break; >> } >> rc = CIFSSMBWrite2(xid, pTcon, open_file->netfid, >> - cur_len, *poffset, &written, >> - to_send, npages, 0); >> + current->tgid, cur_len, *poffset, >> + &written, to_send, npages, 0); >> } while (rc == -EAGAIN); >> >> for (i = 0; i < npages; i++) > > > -- > Jeff Layton <jlayton@xxxxxxxxxxxxxxx> > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Best regards, Pavel Shilovsky. -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html