|
@@ -3445,6 +3445,18 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
|
|
|
#define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
|
|
|
#define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
|
|
|
|
|
|
+/*
|
|
|
+ * On hosts with high memory, we can't currently support wsize/rsize that are
|
|
|
+ * larger than we can kmap at once. Cap the rsize/wsize at
|
|
|
+ * LAST_PKMAP * PAGE_SIZE. We'll never be able to fill a read or write request
|
|
|
+ * larger than that anyway.
|
|
|
+ */
|
|
|
+#ifdef CONFIG_HIGHMEM
|
|
|
+#define CIFS_KMAP_SIZE_LIMIT (LAST_PKMAP * PAGE_CACHE_SIZE)
|
|
|
+#else /* CONFIG_HIGHMEM */
|
|
|
+#define CIFS_KMAP_SIZE_LIMIT (1<<24)
|
|
|
+#endif /* CONFIG_HIGHMEM */
|
|
|
+
|
|
|
static unsigned int
|
|
|
cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
|
|
|
{
|
|
@@ -3475,6 +3487,9 @@ cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
|
|
|
wsize = min_t(unsigned int, wsize,
|
|
|
server->maxBuf - sizeof(WRITE_REQ) + 4);
|
|
|
|
|
|
+ /* limit to the amount that we can kmap at once */
|
|
|
+ wsize = min_t(unsigned int, wsize, CIFS_KMAP_SIZE_LIMIT);
|
|
|
+
|
|
|
/* hard limit of CIFS_MAX_WSIZE */
|
|
|
wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
|
|
|
|
|
@@ -3516,6 +3531,9 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
|
|
|
if (!(server->capabilities & CAP_LARGE_READ_X))
|
|
|
rsize = min_t(unsigned int, CIFSMaxBufSize, rsize);
|
|
|
|
|
|
+ /* limit to the amount that we can kmap at once */
|
|
|
+ rsize = min_t(unsigned int, rsize, CIFS_KMAP_SIZE_LIMIT);
|
|
|
+
|
|
|
/* hard limit of CIFS_MAX_RSIZE */
|
|
|
rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE);
|
|
|
|