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
This commit is contained in:
commit
5faa0154fe
|
@ -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)
|
||||||
|
|
||||||
/* 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)
|
||||||
* 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)
|
||||||
* 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,
|
||||||
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 @@
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
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 {
|
||||||
__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,
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue