diff -Nau /home/stevef/Documents/1.32/fs/cifs/cifsfs.c ./cifsfs.c --- /home/stevef/Documents/1.32/fs/cifs/cifsfs.c 2005-04-03 23:21:41.000000000 -0500 +++ ./cifsfs.c 2005-04-11 23:07:52.196260264 -0500 @@ -32,6 +32,7 @@ #include #include #include +#include #include "cifsfs.h" #include "cifspdu.h" #define DECLARE_GLOBALS_HERE @@ -534,9 +535,9 @@ }; struct inode_operations cifs_symlink_inode_ops = { - .readlink = generic_readlink, + .readlink = cifs_readlink, .follow_link = cifs_follow_link, - .put_link = cifs_put_link, +/* .put_link = cifs_put_link,*/ .permission = cifs_permission, /* BB add the following two eventually */ /* revalidate: cifs_revalidate, @@ -559,16 +560,11 @@ .flush = cifs_flush, .mmap = cifs_file_mmap, .sendfile = generic_file_sendfile, -#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, -#endif /* CONFIG_CIFS_POSIX */ - #ifdef CONFIG_CIFS_EXPERIMENTAL .readv = generic_file_readv, .writev = generic_file_writev, .aio_read = generic_file_aio_read, .aio_write = generic_file_aio_write, - .dir_notify = cifs_dir_notify, #endif /* CONFIG_CIFS_EXPERIMENTAL */ }; @@ -582,14 +578,7 @@ .lock = cifs_lock, .fsync = cifs_fsync, .flush = cifs_flush, - .sendfile = generic_file_sendfile, /* BB removeme BB */ -#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, -#endif /* CONFIG_CIFS_POSIX */ - -#ifdef CONFIG_CIFS_EXPERIMENTAL - .dir_notify = cifs_dir_notify, -#endif /* CONFIG_CIFS_EXPERIMENTAL */ + .sendfile = generic_file_sendfile, }; struct file_operations cifs_dir_ops = { diff -Nau /home/stevef/Documents/1.32/fs/cifs/cifspdu.h ./cifspdu.h --- /home/stevef/Documents/1.32/fs/cifs/cifspdu.h 2005-04-03 23:20:48.000000000 -0500 +++ ./cifspdu.h 2005-04-11 22:09:12.134391008 -0500 @@ -83,6 +83,14 @@ * All constants go here ***************************************************************** */ +#ifndef __le16 +#define __le16 __u16 +#define __le32 __u32 +#define __le64 __u64 +#define __be16 __u16 +#define __be32 __u32 +#define __be64 __u64 +#endif /* * Starting value for maximum SMB size negotiation diff -Nau /home/stevef/Documents/1.32/fs/cifs/connect.c ./connect.c --- /home/stevef/Documents/1.32/fs/cifs/connect.c 2005-04-03 23:21:41.000000000 -0500 +++ ./connect.c 2005-04-11 22:30:18.541867808 -0500 @@ -199,7 +199,8 @@ unsigned int pdu_length, total_read; struct smb_hdr *smb_buffer = NULL; struct msghdr smb_msg; - struct kvec iov; + mm_segment_t temp_fs; + struct iovec iov; struct socket *csocket = server->ssocket; struct list_head *tmp; struct cifsSesInfo *ses; @@ -212,6 +213,9 @@ current->flags |= PF_MEMALLOC; server->tsk = current; /* save process info to wake at shutdown */ cFYI(1, ("Demultiplex PID: %d", current->pid)); + temp_fs = get_fs(); /* we must turn off socket api parm checking */ + set_fs(get_ds()); + write_lock(&GlobalSMBSeslock); atomic_inc(&tcpSesAllocCount); length = tcpSesAllocCount.counter; @@ -236,11 +240,13 @@ } iov.iov_base = smb_buffer; iov.iov_len = 4; + smb_msg.msg_iov = &iov; + smb_msg.msg_iovlen = 1; smb_msg.msg_control = NULL; smb_msg.msg_controllen = 0; length = - kernel_recvmsg(csocket, &smb_msg, - &iov, 1, 4, 0 /* BB see socket.h flags */); + sock_recvmsg(csocket, &smb_msg, + 4, 0 /* BB see socket.h flags */); if(server->tcpStatus == CifsExiting) { break; @@ -331,8 +337,7 @@ for (total_read = 0; total_read < pdu_length; total_read += length) { - length = kernel_recvmsg(csocket, &smb_msg, - &iov, 1, + length = sock_recvmsg(csocket, &smb_msg, pdu_length - total_read, 0); if (length == 0) { cERROR(1, @@ -1000,7 +1005,7 @@ __be16 orig_port = 0; if(*csocket == NULL) { - rc = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, csocket); + rc = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, csocket); if (rc < 0) { cERROR(1, ("Error %d creating socket",rc)); *csocket = NULL; @@ -1108,7 +1113,7 @@ __be16 orig_port = 0; if(*csocket == NULL) { - rc = sock_create_kern(PF_INET6, SOCK_STREAM, IPPROTO_TCP, csocket); + rc = sock_create(PF_INET6, SOCK_STREAM, IPPROTO_TCP, csocket); if (rc < 0) { cERROR(1, ("Error %d creating ipv6 socket",rc)); *csocket = NULL; diff -Nau /home/stevef/Documents/1.32/fs/cifs/dir.c ./dir.c --- /home/stevef/Documents/1.32/fs/cifs/dir.c 2005-04-03 23:20:48.000000000 -0500 +++ ./dir.c 2005-04-11 22:18:20.330052600 -0500 @@ -199,23 +199,23 @@ } if(nd) { - if ((nd->intent.open.flags & O_ACCMODE) == O_RDONLY) + if ((nd->intent.it_flags & O_ACCMODE) == O_RDONLY) desiredAccess = GENERIC_READ; - else if ((nd->intent.open.flags & O_ACCMODE) == O_WRONLY) { + else if ((nd->intent.it_flags & O_ACCMODE) == O_WRONLY) { desiredAccess = GENERIC_WRITE; write_only = TRUE; - } else if ((nd->intent.open.flags & O_ACCMODE) == O_RDWR) { + } else if ((nd->intent.it_flags & O_ACCMODE) == O_RDWR) { /* GENERIC_ALL is too much permission to request */ /* can cause unnecessary access denied on create */ /* desiredAccess = GENERIC_ALL; */ desiredAccess = GENERIC_READ | GENERIC_WRITE; } - if((nd->intent.open.flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) + if((nd->intent.it_flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) disposition = FILE_CREATE; - else if((nd->intent.open.flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) + else if((nd->intent.it_flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) disposition = FILE_OVERWRITE_IF; - else if((nd->intent.open.flags & O_CREAT) == O_CREAT) + else if((nd->intent.it_flags & O_CREAT) == O_CREAT) disposition = FILE_OPEN_IF; else { cFYI(1,("Create flag not set in create function")); diff -Nau /home/stevef/Documents/1.32/fs/cifs/link.c ./link.c --- /home/stevef/Documents/1.32/fs/cifs/link.c 2005-04-03 23:20:48.000000000 -0500 +++ ./link.c 2005-04-11 22:40:48.537093976 -0500 @@ -134,6 +134,7 @@ /* BB Add special case check for Samba DFS symlinks */ target_path[PATH_MAX-1] = 0; + rc = vfs_follow_link(nd, target_path); } else { kfree(target_path); target_path = ERR_PTR(rc); @@ -143,7 +144,7 @@ kfree(full_path); out_no_free: FreeXid(xid); - nd_set_link(nd, target_path); + /*nd_set_link(nd, target_path);*/ return 0; } @@ -319,10 +320,3 @@ FreeXid(xid); return rc; } - -void cifs_put_link(struct dentry *direntry, struct nameidata *nd) -{ - char *p = nd_get_link(nd); - if (!IS_ERR(p)) - kfree(p); -} diff -Nau /home/stevef/Documents/1.32/fs/cifs/Makefile ./Makefile --- /home/stevef/Documents/1.32/fs/cifs/Makefile 2005-04-03 23:20:48.000000000 -0500 +++ ./Makefile 2005-04-11 22:12:38.552010760 -0500 @@ -3,4 +3,4 @@ # obj-$(CONFIG_CIFS) += cifs.o -cifs-objs := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o fcntl.o readdir.o ioctl.o +cifs-objs := cifssmb.o cifs_debug.o file.o inode.o misc.o netmisc.o smbdes.o smbencrypt.o asn1.o md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o readdir.o dir.o connect.o link.o transport.o cifsfs.o Common subdirectories: /home/stevef/Documents/1.32/fs/cifs/.tmp_versions and ./.tmp_versions diff -Nau /home/stevef/Documents/1.32/fs/cifs/transport.c ./transport.c --- /home/stevef/Documents/1.32/fs/cifs/transport.c 2005-04-03 23:20:48.000000000 -0500 +++ ./transport.c 2005-04-11 22:57:08.870060712 -0500 @@ -123,7 +123,8 @@ int rc = 0; int i = 0; struct msghdr smb_msg; - struct kvec iov; + struct iovec iov; + mm_segment_t temp_fs; unsigned len = smb_buf_length + 4; if(ssocket == NULL) @@ -133,6 +134,8 @@ smb_msg.msg_name = sin; smb_msg.msg_namelen = sizeof (struct sockaddr); + smb_msg.msg_iov = &iov; + smb_msg.msg_iovlen = 1; smb_msg.msg_control = NULL; smb_msg.msg_controllen = 0; smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; /* BB add more flags?*/ @@ -146,8 +149,10 @@ cFYI(1, ("Sending smb of length %d ", smb_buf_length)); dump_smb(smb_buffer, len); + temp_fs = get_fs(); /* we must turn off socket api parm checking */ + set_fs(get_ds()); while (len > 0) { - rc = kernel_sendmsg(ssocket, &smb_msg, &iov, 1, len); + rc = sock_sendmsg(ssocket, &smb_msg, len); if ((rc == -ENOSPC) || (rc == -EAGAIN)) { i++; if(i > 60) { @@ -166,6 +171,7 @@ iov.iov_len -= rc; len -= rc; } + set_fs(temp_fs); if (rc < 0) { cERROR(1,("Error %d sending data on socket to server.", rc)); @@ -176,206 +182,6 @@ return rc; } -#ifdef CIFS_EXPERIMENTAL -/* BB finish off this function, adding support for writing set of pages as iovec */ -/* and also adding support for operations that need to parse the response smb */ - -int -smb_sendv(struct socket *ssocket, struct smb_hdr *smb_buffer, - unsigned int smb_buf_length, struct kvec * write_vector /* page list */, struct sockaddr *sin) -{ - int rc = 0; - int i = 0; - struct msghdr smb_msg; - number_of_pages += 1; /* account for SMB header */ - struct kvec * piov = kmalloc(number_of_pages * sizeof(struct kvec)); - if(i=0;ismb_buf_length = cpu_to_be32(smb_buffer->smb_buf_length); - cFYI(1, ("Sending smb of length %d ", smb_buf_length)); - dump_smb(smb_buffer, len); - - while (len > 0) { - rc = kernel_sendmsg(ssocket, &smb_msg, &iov, number_of_pages, len?); - if ((rc == -ENOSPC) || (rc == -EAGAIN)) { - i++; - if(i > 60) { - cERROR(1, - ("sends on sock %p stuck for 30 seconds", - ssocket)); - rc = -EAGAIN; - break; - } - msleep(500); - continue; - } - if (rc < 0) - break; - iov.iov_base += rc; - iov.iov_len -= rc; - len -= rc; - } - - if (rc < 0) { - cERROR(1,("Error %d sending data on socket to server.", rc)); - } else { - rc = 0; - } - - return rc; -} - - -int -CIFSSendRcv(const unsigned int xid, struct cifsSesInfo *ses, - struct smb_hdr *in_buf, struct kvec * write_vector /* page list */, int *pbytes_returned, const int long_op) -{ - int rc = 0; - unsigned long timeout = 15 * HZ; - struct mid_q_entry *midQ = NULL; - - if (ses == NULL) { - cERROR(1,("Null smb session")); - return -EIO; - } - if(ses->server == NULL) { - cERROR(1,("Null tcp session")); - return -EIO; - } - if(pbytes_returned == NULL) - return -EIO; - else - *pbytes_returned = 0; - - - - /* Ensure that we do not send more than 50 overlapping requests - to the same server. We may make this configurable later or - use ses->maxReq */ - if(long_op == -1) { - /* oplock breaks must not be held up */ - atomic_inc(&ses->server->inFlight); - } else { - spin_lock(&GlobalMid_Lock); - while(1) { - if(atomic_read(&ses->server->inFlight) >= cifs_max_pending){ - spin_unlock(&GlobalMid_Lock); - wait_event(ses->server->request_q, - atomic_read(&ses->server->inFlight) - < cifs_max_pending); - spin_lock(&GlobalMid_Lock); - } else { - if(ses->server->tcpStatus == CifsExiting) { - spin_unlock(&GlobalMid_Lock); - return -ENOENT; - } - - /* can not count locking commands against total since - they are allowed to block on server */ - - if(long_op < 3) { - /* update # of requests on the wire to server */ - atomic_inc(&ses->server->inFlight); - } - spin_unlock(&GlobalMid_Lock); - break; - } - } - } - /* make sure that we sign in the same order that we send on this socket - and avoid races inside tcp sendmsg code that could cause corruption - of smb data */ - - down(&ses->server->tcpSem); - - if (ses->server->tcpStatus == CifsExiting) { - rc = -ENOENT; - goto cifs_out_label; - } else if (ses->server->tcpStatus == CifsNeedReconnect) { - cFYI(1,("tcp session dead - return to caller to retry")); - rc = -EAGAIN; - goto cifs_out_label; - } else if (ses->status != CifsGood) { - /* check if SMB session is bad because we are setting it up */ - if((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) && - (in_buf->Command != SMB_COM_NEGOTIATE)) { - rc = -EAGAIN; - goto cifs_out_label; - } /* else ok - we are setting up session */ - } - midQ = AllocMidQEntry(in_buf, ses); - if (midQ == NULL) { - up(&ses->server->tcpSem); - /* If not lock req, update # of requests on wire to server */ - if(long_op < 3) { - atomic_dec(&ses->server->inFlight); - wake_up(&ses->server->request_q); - } - return -ENOMEM; - } - - if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { - up(&ses->server->tcpSem); - cERROR(1, - ("Illegal length, greater than maximum frame, %d ", - in_buf->smb_buf_length)); - DeleteMidQEntry(midQ); - /* If not lock req, update # of requests on wire to server */ - if(long_op < 3) { - atomic_dec(&ses->server->inFlight); - wake_up(&ses->server->request_q); - } - return -EIO; - } - - /* BB can we sign efficiently in this path? */ - rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number); - - midQ->midState = MID_REQUEST_SUBMITTED; -/* rc = smb_sendv(ses->server->ssocket, in_buf, in_buf->smb_buf_length, piovec, - (struct sockaddr *) &(ses->server->addr.sockAddr));*/ - if(rc < 0) { - DeleteMidQEntry(midQ); - up(&ses->server->tcpSem); - /* If not lock req, update # of requests on wire to server */ - if(long_op < 3) { - atomic_dec(&ses->server->inFlight); - wake_up(&ses->server->request_q); - } - return rc; - } else - up(&ses->server->tcpSem); -cifs_out_label: - if(midQ) - DeleteMidQEntry(midQ); - - if(long_op < 3) { - atomic_dec(&ses->server->inFlight); - wake_up(&ses->server->request_q); - } - - return rc; -} - - -#endif /* CIFS_EXPERIMENTAL */ int SendReceive(const unsigned int xid, struct cifsSesInfo *ses,