Commit 5faa0154 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.samba.org/sfrench/cifs-2.6

Pull CIFS fixes from Steve French:
 "A set of three minor cifs fixes"

* 'for-linus' of git://git.samba.org/sfrench/cifs-2.6:
  cifs: make new inode cache when file type is different
  Fix signed/unsigned pointer warning
  Convert MessageID in smb2_hdr to LE
parents b9d4a35f 9e6d722f
...@@ -661,16 +661,16 @@ set_credits(struct TCP_Server_Info *server, const int val) ...@@ -661,16 +661,16 @@ set_credits(struct TCP_Server_Info *server, const int val)
server->ops->set_credits(server, val); server->ops->set_credits(server, val);
} }
static inline __u64 static inline __le64
get_next_mid64(struct TCP_Server_Info *server) get_next_mid64(struct TCP_Server_Info *server)
{ {
return server->ops->get_next_mid(server); return cpu_to_le64(server->ops->get_next_mid(server));
} }
static inline __le16 static inline __le16
get_next_mid(struct TCP_Server_Info *server) get_next_mid(struct TCP_Server_Info *server)
{ {
__u16 mid = get_next_mid64(server); __u16 mid = server->ops->get_next_mid(server);
/* /*
* The value in the SMB header should be little endian for easy * The value in the SMB header should be little endian for easy
* on-the-wire decoding. * on-the-wire decoding.
......
...@@ -926,6 +926,7 @@ cifs_NTtimeToUnix(__le64 ntutc) ...@@ -926,6 +926,7 @@ cifs_NTtimeToUnix(__le64 ntutc)
/* Subtract the NTFS time offset, then convert to 1s intervals. */ /* Subtract the NTFS time offset, then convert to 1s intervals. */
s64 t = le64_to_cpu(ntutc) - NTFS_TIME_OFFSET; s64 t = le64_to_cpu(ntutc) - NTFS_TIME_OFFSET;
u64 abs_t;
/* /*
* Unfortunately can not use normal 64 bit division on 32 bit arch, but * Unfortunately can not use normal 64 bit division on 32 bit arch, but
...@@ -933,13 +934,14 @@ cifs_NTtimeToUnix(__le64 ntutc) ...@@ -933,13 +934,14 @@ cifs_NTtimeToUnix(__le64 ntutc)
* to special case them * to special case them
*/ */
if (t < 0) { if (t < 0) {
t = -t; abs_t = -t;
ts.tv_nsec = (long)(do_div(t, 10000000) * 100); ts.tv_nsec = (long)(do_div(abs_t, 10000000) * 100);
ts.tv_nsec = -ts.tv_nsec; ts.tv_nsec = -ts.tv_nsec;
ts.tv_sec = -t; ts.tv_sec = -abs_t;
} else { } else {
ts.tv_nsec = (long)do_div(t, 10000000) * 100; abs_t = t;
ts.tv_sec = t; ts.tv_nsec = (long)do_div(abs_t, 10000000) * 100;
ts.tv_sec = abs_t;
} }
return ts; return ts;
......
...@@ -69,7 +69,8 @@ static inline void dump_cifs_file_struct(struct file *file, char *label) ...@@ -69,7 +69,8 @@ static inline void dump_cifs_file_struct(struct file *file, char *label)
* Attempt to preload the dcache with the results from the FIND_FIRST/NEXT * Attempt to preload the dcache with the results from the FIND_FIRST/NEXT
* *
* Find the dentry that matches "name". If there isn't one, create one. If it's * Find the dentry that matches "name". If there isn't one, create one. If it's
* a negative dentry or the uniqueid changed, then drop it and recreate it. * a negative dentry or the uniqueid or filetype(mode) changed,
* then drop it and recreate it.
*/ */
static void static void
cifs_prime_dcache(struct dentry *parent, struct qstr *name, cifs_prime_dcache(struct dentry *parent, struct qstr *name,
...@@ -97,8 +98,11 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, ...@@ -97,8 +98,11 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,
if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM))
fattr->cf_uniqueid = CIFS_I(inode)->uniqueid; fattr->cf_uniqueid = CIFS_I(inode)->uniqueid;
/* update inode in place if i_ino didn't change */ /* update inode in place
if (CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { * if both i_ino and i_mode didn't change */
if (CIFS_I(inode)->uniqueid == fattr->cf_uniqueid &&
(inode->i_mode & S_IFMT) ==
(fattr->cf_mode & S_IFMT)) {
cifs_fattr_to_inode(inode, fattr); cifs_fattr_to_inode(inode, fattr);
goto out; goto out;
} }
......
...@@ -32,12 +32,14 @@ ...@@ -32,12 +32,14 @@
static int static int
check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid) check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid)
{ {
__u64 wire_mid = le64_to_cpu(hdr->MessageId);
/* /*
* Make sure that this really is an SMB, that it is a response, * Make sure that this really is an SMB, that it is a response,
* and that the message ids match. * and that the message ids match.
*/ */
if ((*(__le32 *)hdr->ProtocolId == SMB2_PROTO_NUMBER) && if ((*(__le32 *)hdr->ProtocolId == SMB2_PROTO_NUMBER) &&
(mid == hdr->MessageId)) { (mid == wire_mid)) {
if (hdr->Flags & SMB2_FLAGS_SERVER_TO_REDIR) if (hdr->Flags & SMB2_FLAGS_SERVER_TO_REDIR)
return 0; return 0;
else { else {
...@@ -51,11 +53,11 @@ check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid) ...@@ -51,11 +53,11 @@ check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid)
if (*(__le32 *)hdr->ProtocolId != SMB2_PROTO_NUMBER) if (*(__le32 *)hdr->ProtocolId != SMB2_PROTO_NUMBER)
cifs_dbg(VFS, "Bad protocol string signature header %x\n", cifs_dbg(VFS, "Bad protocol string signature header %x\n",
*(unsigned int *) hdr->ProtocolId); *(unsigned int *) hdr->ProtocolId);
if (mid != hdr->MessageId) if (mid != wire_mid)
cifs_dbg(VFS, "Mids do not match: %llu and %llu\n", cifs_dbg(VFS, "Mids do not match: %llu and %llu\n",
mid, hdr->MessageId); mid, wire_mid);
} }
cifs_dbg(VFS, "Bad SMB detected. The Mid=%llu\n", hdr->MessageId); cifs_dbg(VFS, "Bad SMB detected. The Mid=%llu\n", wire_mid);
return 1; return 1;
} }
...@@ -95,7 +97,7 @@ smb2_check_message(char *buf, unsigned int length) ...@@ -95,7 +97,7 @@ smb2_check_message(char *buf, unsigned int length)
{ {
struct smb2_hdr *hdr = (struct smb2_hdr *)buf; struct smb2_hdr *hdr = (struct smb2_hdr *)buf;
struct smb2_pdu *pdu = (struct smb2_pdu *)hdr; struct smb2_pdu *pdu = (struct smb2_pdu *)hdr;
__u64 mid = hdr->MessageId; __u64 mid = le64_to_cpu(hdr->MessageId);
__u32 len = get_rfc1002_length(buf); __u32 len = get_rfc1002_length(buf);
__u32 clc_len; /* calculated length */ __u32 clc_len; /* calculated length */
int command; int command;
......
...@@ -176,10 +176,11 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf) ...@@ -176,10 +176,11 @@ smb2_find_mid(struct TCP_Server_Info *server, char *buf)
{ {
struct mid_q_entry *mid; struct mid_q_entry *mid;
struct smb2_hdr *hdr = (struct smb2_hdr *)buf; struct smb2_hdr *hdr = (struct smb2_hdr *)buf;
__u64 wire_mid = le64_to_cpu(hdr->MessageId);
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
list_for_each_entry(mid, &server->pending_mid_q, qhead) { list_for_each_entry(mid, &server->pending_mid_q, qhead) {
if ((mid->mid == hdr->MessageId) && if ((mid->mid == wire_mid) &&
(mid->mid_state == MID_REQUEST_SUBMITTED) && (mid->mid_state == MID_REQUEST_SUBMITTED) &&
(mid->command == hdr->Command)) { (mid->command == hdr->Command)) {
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
......
...@@ -110,7 +110,7 @@ struct smb2_hdr { ...@@ -110,7 +110,7 @@ struct smb2_hdr {
__le16 CreditRequest; /* CreditResponse */ __le16 CreditRequest; /* CreditResponse */
__le32 Flags; __le32 Flags;
__le32 NextCommand; __le32 NextCommand;
__u64 MessageId; /* opaque - so can stay little endian */ __le64 MessageId;
__le32 ProcessId; __le32 ProcessId;
__u32 TreeId; /* opaque - so do not make little endian */ __u32 TreeId; /* opaque - so do not make little endian */
__u64 SessionId; /* opaque - so do not make little endian */ __u64 SessionId; /* opaque - so do not make little endian */
......
...@@ -490,7 +490,7 @@ smb2_mid_entry_alloc(const struct smb2_hdr *smb_buffer, ...@@ -490,7 +490,7 @@ smb2_mid_entry_alloc(const struct smb2_hdr *smb_buffer,
return temp; return temp;
else { else {
memset(temp, 0, sizeof(struct mid_q_entry)); memset(temp, 0, sizeof(struct mid_q_entry));
temp->mid = smb_buffer->MessageId; /* always LE */ temp->mid = le64_to_cpu(smb_buffer->MessageId);
temp->pid = current->pid; temp->pid = current->pid;
temp->command = smb_buffer->Command; /* Always LE */ temp->command = smb_buffer->Command; /* Always LE */
temp->when_alloc = jiffies; temp->when_alloc = jiffies;
......
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