Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+28 -19
+3 -3
fs/cifs/cifsglob.h
··· 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.
+7 -5
fs/cifs/netmisc.c
··· 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 ··· 934 933 * to special case them 935 934 */ 936 935 if (t < 0) { 937 - t = -t; 938 - ts.tv_nsec = (long)(do_div(t, 10000000) * 100); 936 + abs_t = -t; 937 + ts.tv_nsec = (long)(do_div(abs_t, 10000000) * 100); 939 938 ts.tv_nsec = -ts.tv_nsec; 940 - ts.tv_sec = -t; 939 + ts.tv_sec = -abs_t; 941 940 } else { 942 - ts.tv_nsec = (long)do_div(t, 10000000) * 100; 943 - ts.tv_sec = t; 941 + abs_t = t; 942 + ts.tv_nsec = (long)do_div(abs_t, 10000000) * 100; 943 + ts.tv_sec = abs_t; 944 944 } 945 945 946 946 return ts;
+7 -3
fs/cifs/readdir.c
··· 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, ··· 98 97 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) 99 98 fattr->cf_uniqueid = CIFS_I(inode)->uniqueid; 100 99 101 - /* update inode in place if i_ino didn't change */ 102 - if (CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { 100 + /* update inode in place 101 + * if both i_ino and i_mode didn't change */ 102 + if (CIFS_I(inode)->uniqueid == fattr->cf_uniqueid && 103 + (inode->i_mode & S_IFMT) == 104 + (fattr->cf_mode & S_IFMT)) { 103 105 cifs_fattr_to_inode(inode, fattr); 104 106 goto out; 105 107 }
+7 -5
fs/cifs/smb2misc.c
··· 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 { ··· 53 51 if (*(__le32 *)hdr->ProtocolId != SMB2_PROTO_NUMBER) 54 52 cifs_dbg(VFS, "Bad protocol string signature header %x\n", 55 53 *(unsigned int *) hdr->ProtocolId); 56 - if (mid != hdr->MessageId) 54 + if (mid != wire_mid) 57 55 cifs_dbg(VFS, "Mids do not match: %llu and %llu\n", 58 - mid, hdr->MessageId); 56 + mid, wire_mid); 59 57 } 60 - cifs_dbg(VFS, "Bad SMB detected. The Mid=%llu\n", hdr->MessageId); 58 + cifs_dbg(VFS, "Bad SMB detected. The Mid=%llu\n", wire_mid); 61 59 return 1; 62 60 } 63 61 ··· 97 95 { 98 96 struct smb2_hdr *hdr = (struct smb2_hdr *)buf; 99 97 struct smb2_pdu *pdu = (struct smb2_pdu *)hdr; 100 - __u64 mid = hdr->MessageId; 98 + __u64 mid = le64_to_cpu(hdr->MessageId); 101 99 __u32 len = get_rfc1002_length(buf); 102 100 __u32 clc_len; /* calculated length */ 103 101 int command;
+2 -1
fs/cifs/smb2ops.c
··· 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);
+1 -1
fs/cifs/smb2pdu.h
··· 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 */
+1 -1
fs/cifs/smb2transport.c
··· 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;