cifs: avoid use of dstaddr as key for fscache client cookie

server->dstaddr can change when the DNS mapping for the
server hostname changes. But conn_id is a u64 counter
that is incremented each time a new TCP connection
is setup. So use only that as a key.

Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by Shyam Prasad N and committed by Steve French bbb9db5e 2adc8200

+1 -37
+1 -37
fs/cifs/fscache.c
··· 16 16 * Key layout of CIFS server cache index object 17 17 */ 18 18 struct cifs_server_key { 19 - struct { 20 - uint16_t family; /* address family */ 21 - __be16 port; /* IP port */ 22 - } hdr; 23 - union { 24 - struct in_addr ipv4_addr; 25 - struct in6_addr ipv6_addr; 26 - }; 27 19 __u64 conn_id; 28 20 } __packed; 29 21 ··· 24 32 */ 25 33 void cifs_fscache_get_client_cookie(struct TCP_Server_Info *server) 26 34 { 27 - const struct sockaddr *sa = (struct sockaddr *) &server->dstaddr; 28 - const struct sockaddr_in *addr = (struct sockaddr_in *) sa; 29 - const struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) sa; 30 35 struct cifs_server_key key; 31 - uint16_t key_len = sizeof(key.hdr); 32 36 33 37 /* 34 38 * Check if cookie was already initialized so don't reinitialize it. ··· 35 47 return; 36 48 37 49 memset(&key, 0, sizeof(key)); 38 - 39 - /* 40 - * Should not be a problem as sin_family/sin6_family overlays 41 - * sa_family field 42 - */ 43 - key.hdr.family = sa->sa_family; 44 - switch (sa->sa_family) { 45 - case AF_INET: 46 - key.hdr.port = addr->sin_port; 47 - key.ipv4_addr = addr->sin_addr; 48 - key_len += sizeof(key.ipv4_addr); 49 - break; 50 - 51 - case AF_INET6: 52 - key.hdr.port = addr6->sin6_port; 53 - key.ipv6_addr = addr6->sin6_addr; 54 - key_len += sizeof(key.ipv6_addr); 55 - break; 56 - 57 - default: 58 - cifs_dbg(VFS, "Unknown network family '%d'\n", sa->sa_family); 59 - server->fscache = NULL; 60 - return; 61 - } 62 50 key.conn_id = server->conn_id; 63 51 64 52 server->fscache = 65 53 fscache_acquire_cookie(cifs_fscache_netfs.primary_index, 66 54 &cifs_fscache_server_index_def, 67 - &key, key_len, 55 + &key, sizeof(key), 68 56 NULL, 0, 69 57 server, 0, true); 70 58 cifs_dbg(FYI, "%s: (0x%p/0x%p)\n",