Commit 5faa0154fe333e11ae3826296e08eada1d1d2ec8
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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
Showing 7 changed files Side-by-side Diff
fs/cifs/cifsglob.h
... | ... | @@ -661,16 +661,16 @@ |
661 | 661 | server->ops->set_credits(server, val); |
662 | 662 | } |
663 | 663 | |
664 | -static inline __u64 | |
664 | +static inline __le64 | |
665 | 665 | get_next_mid64(struct TCP_Server_Info *server) |
666 | 666 | { |
667 | - return server->ops->get_next_mid(server); | |
667 | + return cpu_to_le64(server->ops->get_next_mid(server)); | |
668 | 668 | } |
669 | 669 | |
670 | 670 | static inline __le16 |
671 | 671 | get_next_mid(struct TCP_Server_Info *server) |
672 | 672 | { |
673 | - __u16 mid = get_next_mid64(server); | |
673 | + __u16 mid = server->ops->get_next_mid(server); | |
674 | 674 | /* |
675 | 675 | * The value in the SMB header should be little endian for easy |
676 | 676 | * on-the-wire decoding. |
fs/cifs/netmisc.c
... | ... | @@ -926,6 +926,7 @@ |
926 | 926 | |
927 | 927 | /* Subtract the NTFS time offset, then convert to 1s intervals. */ |
928 | 928 | s64 t = le64_to_cpu(ntutc) - NTFS_TIME_OFFSET; |
929 | + u64 abs_t; | |
929 | 930 | |
930 | 931 | /* |
931 | 932 | * Unfortunately can not use normal 64 bit division on 32 bit arch, but |
932 | 933 | |
933 | 934 | |
... | ... | @@ -933,13 +934,14 @@ |
933 | 934 | * to special case them |
934 | 935 | */ |
935 | 936 | if (t < 0) { |
936 | - t = -t; | |
937 | - ts.tv_nsec = (long)(do_div(t, 10000000) * 100); | |
937 | + abs_t = -t; | |
938 | + ts.tv_nsec = (long)(do_div(abs_t, 10000000) * 100); | |
938 | 939 | ts.tv_nsec = -ts.tv_nsec; |
939 | - ts.tv_sec = -t; | |
940 | + ts.tv_sec = -abs_t; | |
940 | 941 | } else { |
941 | - ts.tv_nsec = (long)do_div(t, 10000000) * 100; | |
942 | - ts.tv_sec = t; | |
942 | + abs_t = t; | |
943 | + ts.tv_nsec = (long)do_div(abs_t, 10000000) * 100; | |
944 | + ts.tv_sec = abs_t; | |
943 | 945 | } |
944 | 946 | |
945 | 947 | return ts; |
fs/cifs/readdir.c
... | ... | @@ -69,7 +69,8 @@ |
69 | 69 | * Attempt to preload the dcache with the results from the FIND_FIRST/NEXT |
70 | 70 | * |
71 | 71 | * Find the dentry that matches "name". If there isn't one, create one. If it's |
72 | - * a negative dentry or the uniqueid changed, then drop it and recreate it. | |
72 | + * a negative dentry or the uniqueid or filetype(mode) changed, | |
73 | + * then drop it and recreate it. | |
73 | 74 | */ |
74 | 75 | static void |
75 | 76 | cifs_prime_dcache(struct dentry *parent, struct qstr *name, |
... | ... | @@ -97,8 +98,11 @@ |
97 | 98 | if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) |
98 | 99 | fattr->cf_uniqueid = CIFS_I(inode)->uniqueid; |
99 | 100 | |
100 | - /* update inode in place if i_ino didn't change */ | |
101 | - if (CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { | |
101 | + /* update inode in place | |
102 | + * if both i_ino and i_mode didn't change */ | |
103 | + if (CIFS_I(inode)->uniqueid == fattr->cf_uniqueid && | |
104 | + (inode->i_mode & S_IFMT) == | |
105 | + (fattr->cf_mode & S_IFMT)) { | |
102 | 106 | cifs_fattr_to_inode(inode, fattr); |
103 | 107 | goto out; |
104 | 108 | } |
fs/cifs/smb2misc.c
... | ... | @@ -32,12 +32,14 @@ |
32 | 32 | static int |
33 | 33 | check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid) |
34 | 34 | { |
35 | + __u64 wire_mid = le64_to_cpu(hdr->MessageId); | |
36 | + | |
35 | 37 | /* |
36 | 38 | * Make sure that this really is an SMB, that it is a response, |
37 | 39 | * and that the message ids match. |
38 | 40 | */ |
39 | 41 | if ((*(__le32 *)hdr->ProtocolId == SMB2_PROTO_NUMBER) && |
40 | - (mid == hdr->MessageId)) { | |
42 | + (mid == wire_mid)) { | |
41 | 43 | if (hdr->Flags & SMB2_FLAGS_SERVER_TO_REDIR) |
42 | 44 | return 0; |
43 | 45 | else { |
44 | 46 | |
45 | 47 | |
... | ... | @@ -51,11 +53,11 @@ |
51 | 53 | if (*(__le32 *)hdr->ProtocolId != SMB2_PROTO_NUMBER) |
52 | 54 | cifs_dbg(VFS, "Bad protocol string signature header %x\n", |
53 | 55 | *(unsigned int *) hdr->ProtocolId); |
54 | - if (mid != hdr->MessageId) | |
56 | + if (mid != wire_mid) | |
55 | 57 | cifs_dbg(VFS, "Mids do not match: %llu and %llu\n", |
56 | - mid, hdr->MessageId); | |
58 | + mid, wire_mid); | |
57 | 59 | } |
58 | - cifs_dbg(VFS, "Bad SMB detected. The Mid=%llu\n", hdr->MessageId); | |
60 | + cifs_dbg(VFS, "Bad SMB detected. The Mid=%llu\n", wire_mid); | |
59 | 61 | return 1; |
60 | 62 | } |
61 | 63 | |
... | ... | @@ -95,7 +97,7 @@ |
95 | 97 | { |
96 | 98 | struct smb2_hdr *hdr = (struct smb2_hdr *)buf; |
97 | 99 | struct smb2_pdu *pdu = (struct smb2_pdu *)hdr; |
98 | - __u64 mid = hdr->MessageId; | |
100 | + __u64 mid = le64_to_cpu(hdr->MessageId); | |
99 | 101 | __u32 len = get_rfc1002_length(buf); |
100 | 102 | __u32 clc_len; /* calculated length */ |
101 | 103 | int command; |
fs/cifs/smb2ops.c
... | ... | @@ -176,10 +176,11 @@ |
176 | 176 | { |
177 | 177 | struct mid_q_entry *mid; |
178 | 178 | struct smb2_hdr *hdr = (struct smb2_hdr *)buf; |
179 | + __u64 wire_mid = le64_to_cpu(hdr->MessageId); | |
179 | 180 | |
180 | 181 | spin_lock(&GlobalMid_Lock); |
181 | 182 | list_for_each_entry(mid, &server->pending_mid_q, qhead) { |
182 | - if ((mid->mid == hdr->MessageId) && | |
183 | + if ((mid->mid == wire_mid) && | |
183 | 184 | (mid->mid_state == MID_REQUEST_SUBMITTED) && |
184 | 185 | (mid->command == hdr->Command)) { |
185 | 186 | spin_unlock(&GlobalMid_Lock); |
fs/cifs/smb2pdu.h
... | ... | @@ -110,7 +110,7 @@ |
110 | 110 | __le16 CreditRequest; /* CreditResponse */ |
111 | 111 | __le32 Flags; |
112 | 112 | __le32 NextCommand; |
113 | - __u64 MessageId; /* opaque - so can stay little endian */ | |
113 | + __le64 MessageId; | |
114 | 114 | __le32 ProcessId; |
115 | 115 | __u32 TreeId; /* opaque - so do not make little endian */ |
116 | 116 | __u64 SessionId; /* opaque - so do not make little endian */ |
fs/cifs/smb2transport.c
... | ... | @@ -490,7 +490,7 @@ |
490 | 490 | return temp; |
491 | 491 | else { |
492 | 492 | memset(temp, 0, sizeof(struct mid_q_entry)); |
493 | - temp->mid = smb_buffer->MessageId; /* always LE */ | |
493 | + temp->mid = le64_to_cpu(smb_buffer->MessageId); | |
494 | 494 | temp->pid = current->pid; |
495 | 495 | temp->command = smb_buffer->Command; /* Always LE */ |
496 | 496 | temp->when_alloc = jiffies; |