diff options
Diffstat (limited to 'fs/nfs/super.c')
-rw-r--r-- | fs/nfs/super.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 7efc6a34b56b..3cbe32f3e88b 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -652,12 +652,23 @@ static void nfs_parse_server_address(char *value, | |||
652 | struct sockaddr *sap, | 652 | struct sockaddr *sap, |
653 | size_t *len) | 653 | size_t *len) |
654 | { | 654 | { |
655 | struct sockaddr_in *ap = (void *)sap; | 655 | if (strchr(value, ':')) { |
656 | struct sockaddr_in6 *ap = (struct sockaddr_in6 *)sap; | ||
657 | u8 *addr = (u8 *)&ap->sin6_addr.in6_u; | ||
656 | 658 | ||
657 | ap->sin_family = AF_INET; | 659 | ap->sin6_family = AF_INET6; |
658 | *len = sizeof(*ap); | 660 | *len = sizeof(*ap); |
659 | if (in4_pton(value, -1, (u8 *)&ap->sin_addr.s_addr, '\0', NULL)) | 661 | if (in6_pton(value, -1, addr, '\0', NULL)) |
660 | return; | 662 | return; |
663 | } else { | ||
664 | struct sockaddr_in *ap = (struct sockaddr_in *)sap; | ||
665 | u8 *addr = (u8 *)&ap->sin_addr.s_addr; | ||
666 | |||
667 | ap->sin_family = AF_INET; | ||
668 | *len = sizeof(*ap); | ||
669 | if (in4_pton(value, -1, addr, '\0', NULL)) | ||
670 | return; | ||
671 | } | ||
661 | 672 | ||
662 | sap->sa_family = AF_UNSPEC; | 673 | sap->sa_family = AF_UNSPEC; |
663 | *len = 0; | 674 | *len = 0; |