diff options
| -rw-r--r-- | fs/cifs/connect.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 78db68a5cf44..0ae86ddf2213 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -1653,24 +1653,26 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 1653 | * If yes, we have encountered a double deliminator | 1653 | * If yes, we have encountered a double deliminator |
| 1654 | * reset the NULL character to the deliminator | 1654 | * reset the NULL character to the deliminator |
| 1655 | */ | 1655 | */ |
| 1656 | if (tmp_end < end && tmp_end[1] == delim) | 1656 | if (tmp_end < end && tmp_end[1] == delim) { |
| 1657 | tmp_end[0] = delim; | 1657 | tmp_end[0] = delim; |
| 1658 | 1658 | ||
| 1659 | /* Keep iterating until we get to a single deliminator | 1659 | /* Keep iterating until we get to a single |
| 1660 | * OR the end | 1660 | * deliminator OR the end |
| 1661 | */ | 1661 | */ |
| 1662 | while ((tmp_end = strchr(tmp_end, delim)) != NULL && | 1662 | while ((tmp_end = strchr(tmp_end, delim)) |
| 1663 | (tmp_end[1] == delim)) { | 1663 | != NULL && (tmp_end[1] == delim)) { |
| 1664 | tmp_end = (char *) &tmp_end[2]; | 1664 | tmp_end = (char *) &tmp_end[2]; |
| 1665 | } | 1665 | } |
| 1666 | 1666 | ||
| 1667 | /* Reset var options to point to next element */ | 1667 | /* Reset var options to point to next element */ |
| 1668 | if (tmp_end) { | 1668 | if (tmp_end) { |
| 1669 | tmp_end[0] = '\0'; | 1669 | tmp_end[0] = '\0'; |
| 1670 | options = (char *) &tmp_end[1]; | 1670 | options = (char *) &tmp_end[1]; |
| 1671 | } else | 1671 | } else |
| 1672 | /* Reached the end of the mount option string */ | 1672 | /* Reached the end of the mount option |
| 1673 | options = end; | 1673 | * string */ |
| 1674 | options = end; | ||
| 1675 | } | ||
| 1674 | 1676 | ||
| 1675 | /* Now build new password string */ | 1677 | /* Now build new password string */ |
| 1676 | temp_len = strlen(value); | 1678 | temp_len = strlen(value); |
| @@ -3493,18 +3495,15 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) | |||
| 3493 | * MS-CIFS indicates that servers are only limited by the client's | 3495 | * MS-CIFS indicates that servers are only limited by the client's |
| 3494 | * bufsize for reads, testing against win98se shows that it throws | 3496 | * bufsize for reads, testing against win98se shows that it throws |
| 3495 | * INVALID_PARAMETER errors if you try to request too large a read. | 3497 | * INVALID_PARAMETER errors if you try to request too large a read. |
| 3498 | * OS/2 just sends back short reads. | ||
| 3496 | * | 3499 | * |
| 3497 | * If the server advertises a MaxBufferSize of less than one page, | 3500 | * If the server doesn't advertise CAP_LARGE_READ_X, then assume that |
| 3498 | * assume that it also can't satisfy reads larger than that either. | 3501 | * it can't handle a read request larger than its MaxBufferSize either. |
| 3499 | * | ||
| 3500 | * FIXME: Is there a better heuristic for this? | ||
| 3501 | */ | 3502 | */ |
| 3502 | if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP)) | 3503 | if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP)) |
| 3503 | defsize = CIFS_DEFAULT_IOSIZE; | 3504 | defsize = CIFS_DEFAULT_IOSIZE; |
| 3504 | else if (server->capabilities & CAP_LARGE_READ_X) | 3505 | else if (server->capabilities & CAP_LARGE_READ_X) |
| 3505 | defsize = CIFS_DEFAULT_NON_POSIX_RSIZE; | 3506 | defsize = CIFS_DEFAULT_NON_POSIX_RSIZE; |
| 3506 | else if (server->maxBuf >= PAGE_CACHE_SIZE) | ||
| 3507 | defsize = CIFSMaxBufSize; | ||
| 3508 | else | 3507 | else |
| 3509 | defsize = server->maxBuf - sizeof(READ_RSP); | 3508 | defsize = server->maxBuf - sizeof(READ_RSP); |
| 3510 | 3509 | ||
