return 0;
 }
 
-static void * 
-cifs_kcalloc(size_t size, unsigned int __nocast type)
-{
-       void *addr;
-       addr = kmalloc(size, type);
-       if (addr)
-               memset(addr, 0, size);
-       return addr;
-}
-
 static int
 cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
 {
                                /* go from value to value + temp_len condensing 
                                double commas to singles. Note that this ends up
                                allocating a few bytes too many, which is ok */
-                               vol->password = cifs_kcalloc(temp_len, GFP_KERNEL);
+                               vol->password = kcalloc(1, temp_len, GFP_KERNEL);
+                               if(vol->password == NULL) {
+                                       printk("CIFS: no memory for pass\n");
+                                       return 1;
+                               }
                                for(i=0,j=0;i<temp_len;i++,j++) {
                                        vol->password[j] = value[i];
                                        if(value[i] == separator[0] && value[i+1] == separator[0]) {
                                }
                                vol->password[j] = 0;
                        } else {
-                               vol->password = cifs_kcalloc(temp_len + 1, GFP_KERNEL);
+                               vol->password = kcalloc(1, temp_len + 1, GFP_KERNEL);
+                               if(vol->password == NULL) {
+                                       printk("CIFS: no memory for pass\n");
+                                       return 1;
+                               }
                                strcpy(vol->password, value);
                        }
                } else if (strnicmp(data, "ip", 2) == 0) {
                sessinit is sent but no second negprot */
                struct rfc1002_session_packet * ses_init_buf;
                struct smb_hdr * smb_buf;
-               ses_init_buf = cifs_kcalloc(sizeof(struct rfc1002_session_packet), GFP_KERNEL);
+               ses_init_buf = kcalloc(1, sizeof(struct rfc1002_session_packet), GFP_KERNEL);
                if(ses_init_buf) {
                        ses_init_buf->trailer.session_req.called_len = 32;
                        rfc1002mangle(ses_init_buf->trailer.session_req.called_name,
 /* We look for obvious messed up bcc or strings in response so we do not go off
    the end since (at least) WIN2K and Windows XP have a major bug in not null
    terminating last Unicode string in response  */
-                               ses->serverOS = cifs_kcalloc(2 * (len + 1), GFP_KERNEL);
+                               ses->serverOS = kcalloc(1, 2 * (len + 1), GFP_KERNEL);
+                               if(ses->serverOS == NULL)
+                                       goto sesssetup_nomem;
                                cifs_strfromUCS_le(ses->serverOS,
                                           (wchar_t *)bcc_ptr, len,nls_codepage);
                                bcc_ptr += 2 * (len + 1);
                                if (remaining_words > 0) {
                                        len = UniStrnlen((wchar_t *)bcc_ptr,
                                                         remaining_words-1);
-                                       ses->serverNOS =cifs_kcalloc(2 * (len + 1),GFP_KERNEL);
+                                       ses->serverNOS = kcalloc(1, 2 * (len + 1),GFP_KERNEL);
+                                       if(ses->serverNOS == NULL)
+                                               goto sesssetup_nomem;
                                        cifs_strfromUCS_le(ses->serverNOS,
                                                           (wchar_t *)bcc_ptr,len,nls_codepage);
                                        bcc_ptr += 2 * (len + 1);
                                        }
                                        remaining_words -= len + 1;
                                        if (remaining_words > 0) {
-                                               len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); 
+                                               len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words);
           /* last string is not always null terminated (for e.g. for Windows XP & 2000) */
                                                ses->serverDomain =
-                                                   cifs_kcalloc(2*(len+1),GFP_KERNEL);
+                                                   kcalloc(1, 2*(len+1),GFP_KERNEL);
+                                               if(ses->serverDomain == NULL)
+                                                       goto sesssetup_nomem;
                                                cifs_strfromUCS_le(ses->serverDomain,
                                                     (wchar_t *)bcc_ptr,len,nls_codepage);
                                                bcc_ptr += 2 * (len + 1);
                                                ses->serverDomain[1+(2*len)] = 0;
                                        } /* else no more room so create dummy domain string */
                                        else
-                                               ses->serverDomain =
-                                                   cifs_kcalloc(2,
-                                                           GFP_KERNEL);
+                                               ses->serverDomain = 
+                                                       kcalloc(1, 2, GFP_KERNEL);
                                } else {        /* no room so create dummy domain and NOS string */
+                                       /* if these kcallocs fail not much we
+                                          can do, but better to not fail the
+                                          sesssetup itself */
                                        ses->serverDomain =
-                                           cifs_kcalloc(2, GFP_KERNEL);
+                                           kcalloc(1, 2, GFP_KERNEL);
                                        ses->serverNOS =
-                                           cifs_kcalloc(2, GFP_KERNEL);
+                                           kcalloc(1, 2, GFP_KERNEL);
                                }
                        } else {        /* ASCII */
                                len = strnlen(bcc_ptr, 1024);
                                if (((long) bcc_ptr + len) - (long)
                                    pByteArea(smb_buffer_response)
                                            <= BCC(smb_buffer_response)) {
-                                       ses->serverOS = cifs_kcalloc(len + 1,GFP_KERNEL);
+                                       ses->serverOS = kcalloc(1, len + 1,GFP_KERNEL);
+                                       if(ses->serverOS == NULL)
+                                               goto sesssetup_nomem;
                                        strncpy(ses->serverOS,bcc_ptr, len);
 
                                        bcc_ptr += len;
                                        bcc_ptr++;
 
                                        len = strnlen(bcc_ptr, 1024);
-                                       ses->serverNOS = cifs_kcalloc(len + 1,GFP_KERNEL);
+                                       ses->serverNOS = kcalloc(1, len + 1,GFP_KERNEL);
+                                       if(ses->serverNOS == NULL)
+                                               goto sesssetup_nomem;
                                        strncpy(ses->serverNOS, bcc_ptr, len);
                                        bcc_ptr += len;
                                        bcc_ptr[0] = 0;
                                        bcc_ptr++;
 
                                        len = strnlen(bcc_ptr, 1024);
-                                       ses->serverDomain = cifs_kcalloc(len + 1,GFP_KERNEL);
+                                       ses->serverDomain = kcalloc(1, len + 1,GFP_KERNEL);
+                                       if(ses->serverDomain == NULL)
+                                               goto sesssetup_nomem;
                                        strncpy(ses->serverDomain, bcc_ptr, len);
                                        bcc_ptr += len;
                                        bcc_ptr[0] = 0;
                        smb_buffer_response->WordCount));
                rc = -EIO;
        }
-       
+sesssetup_nomem:       /* do not return an error on nomem for the info strings,
+                          since that could make reconnection harder, and
+                          reconnection might be needed to free memory */
        if (smb_buffer)
                cifs_buf_release(smb_buffer);
 
    the end since (at least) WIN2K and Windows XP have a major bug in not null
    terminating last Unicode string in response  */
                                        ses->serverOS =
-                                           cifs_kcalloc(2 * (len + 1), GFP_KERNEL);
+                                           kcalloc(1, 2 * (len + 1), GFP_KERNEL);
                                        cifs_strfromUCS_le(ses->serverOS,
                                                           (wchar_t *)
                                                           bcc_ptr, len,
                                                                 remaining_words
                                                                 - 1);
                                                ses->serverNOS =
-                                                   cifs_kcalloc(2 * (len + 1),
+                                                   kcalloc(1, 2 * (len + 1),
                                                            GFP_KERNEL);
                                                cifs_strfromUCS_le(ses->serverNOS,
                                                                   (wchar_t *)bcc_ptr,
                                                if (remaining_words > 0) {
                                                        len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); 
                             /* last string is not always null terminated (for e.g. for Windows XP & 2000) */
-                                                       ses->serverDomain = cifs_kcalloc(2*(len+1),GFP_KERNEL);
+                                                       ses->serverDomain = kcalloc(1, 2*(len+1),GFP_KERNEL);
                                                        cifs_strfromUCS_le(ses->serverDomain,
                                                             (wchar_t *)bcc_ptr, 
                                  len,
                                                } /* else no more room so create dummy domain string */
                                                else
                                                        ses->serverDomain =
-                                                           cifs_kcalloc(2,GFP_KERNEL);
+                                                           kcalloc(1, 2,GFP_KERNEL);
                                        } else {        /* no room so create dummy domain and NOS string */
-                                               ses->serverDomain = cifs_kcalloc(2, GFP_KERNEL);
-                                               ses->serverNOS = cifs_kcalloc(2, GFP_KERNEL);
+                                               ses->serverDomain = kcalloc(1, 2, GFP_KERNEL);
+                                               ses->serverNOS = kcalloc(1, 2, GFP_KERNEL);
                                        }
                                } else {        /* ASCII */
 
                                        if (((long) bcc_ptr + len) - (long)
                                            pByteArea(smb_buffer_response)
                                            <= BCC(smb_buffer_response)) {
-                                               ses->serverOS = cifs_kcalloc(len + 1, GFP_KERNEL);
+                                               ses->serverOS = kcalloc(1, len + 1, GFP_KERNEL);
                                                strncpy(ses->serverOS, bcc_ptr, len);
 
                                                bcc_ptr += len;
                                                bcc_ptr++;
 
                                                len = strnlen(bcc_ptr, 1024);
-                                               ses->serverNOS = cifs_kcalloc(len + 1,GFP_KERNEL);
+                                               ses->serverNOS = kcalloc(1, len + 1,GFP_KERNEL);
                                                strncpy(ses->serverNOS, bcc_ptr, len);
                                                bcc_ptr += len;
                                                bcc_ptr[0] = 0;
                                                bcc_ptr++;
 
                                                len = strnlen(bcc_ptr, 1024);
-                                               ses->serverDomain = cifs_kcalloc(len + 1, GFP_KERNEL);
+                                               ses->serverDomain = kcalloc(1, len + 1, GFP_KERNEL);
                                                strncpy(ses->serverDomain, bcc_ptr, len);
                                                bcc_ptr += len;
                                                bcc_ptr[0] = 0;
    the end since (at least) WIN2K and Windows XP have a major bug in not null
    terminating last Unicode string in response  */
                                        ses->serverOS =
-                                           cifs_kcalloc(2 * (len + 1), GFP_KERNEL);
+                                           kcalloc(1, 2 * (len + 1), GFP_KERNEL);
                                        cifs_strfromUCS_le(ses->serverOS,
                                                           (wchar_t *)
                                                           bcc_ptr, len,
                                                                 remaining_words
                                                                 - 1);
                                                ses->serverNOS =
-                                                   cifs_kcalloc(2 * (len + 1),
+                                                   kcalloc(1, 2 * (len + 1),
                                                            GFP_KERNEL);
                                                cifs_strfromUCS_le(ses->
                                                                   serverNOS,
                                                        len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); 
            /* last string is not always null terminated (for e.g. for Windows XP & 2000) */
                                                        ses->serverDomain =
-                                                           cifs_kcalloc(2 *
+                                                           kcalloc(1, 2 *
                                                                    (len +
                                                                     1),
                                                                    GFP_KERNEL);
                                                } /* else no more room so create dummy domain string */
                                                else
                                                        ses->serverDomain =
-                                                           cifs_kcalloc(2,
+                                                           kcalloc(1, 2,
                                                                    GFP_KERNEL);
                                        } else {        /* no room so create dummy domain and NOS string */
                                                ses->serverDomain =
-                                                   cifs_kcalloc(2, GFP_KERNEL);
+                                                   kcalloc(1, 2, GFP_KERNEL);
                                                ses->serverNOS =
-                                                   cifs_kcalloc(2, GFP_KERNEL);
+                                                   kcalloc(1, 2, GFP_KERNEL);
                                        }
                                } else {        /* ASCII */
                                        len = strnlen(bcc_ptr, 1024);
                                            pByteArea(smb_buffer_response)
                                            <= BCC(smb_buffer_response)) {
                                                ses->serverOS =
-                                                   cifs_kcalloc(len + 1,
+                                                   kcalloc(1, len + 1,
                                                            GFP_KERNEL);
                                                strncpy(ses->serverOS,
                                                        bcc_ptr, len);
 
                                                len = strnlen(bcc_ptr, 1024);
                                                ses->serverNOS =
-                                                   cifs_kcalloc(len + 1,
+                                                   kcalloc(1, len + 1,
                                                            GFP_KERNEL);
                                                strncpy(ses->serverNOS, bcc_ptr, len);
                                                bcc_ptr += len;
 
                                                len = strnlen(bcc_ptr, 1024);
                                                ses->serverDomain =
-                                                   cifs_kcalloc(len + 1,
+                                                   kcalloc(1, len + 1,
                                                            GFP_KERNEL);
                                                strncpy(ses->serverDomain, bcc_ptr, len);       
                                                bcc_ptr += len;
   the end since (at least) WIN2K and Windows XP have a major bug in not null
   terminating last Unicode string in response  */
                                        ses->serverOS =
-                                           cifs_kcalloc(2 * (len + 1), GFP_KERNEL);
+                                           kcalloc(1, 2 * (len + 1), GFP_KERNEL);
                                        cifs_strfromUCS_le(ses->serverOS,
                                                           (wchar_t *)
                                                           bcc_ptr, len,
                                                                 remaining_words
                                                                 - 1);
                                                ses->serverNOS =
-                                                   cifs_kcalloc(2 * (len + 1),
+                                                   kcalloc(1, 2 * (len + 1),
                                                            GFP_KERNEL);
                                                cifs_strfromUCS_le(ses->
                                                                   serverNOS,
                                                        len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); 
      /* last string not always null terminated (e.g. for Windows XP & 2000) */
                                                        ses->serverDomain =
-                                                           cifs_kcalloc(2 *
+                                                           kcalloc(1, 2 *
                                                                    (len +
                                                                     1),
                                                                    GFP_KERNEL);
                                                            = 0;
                                                } /* else no more room so create dummy domain string */
                                                else
-                                                       ses->serverDomain = cifs_kcalloc(2,GFP_KERNEL);
+                                                       ses->serverDomain = kcalloc(1, 2,GFP_KERNEL);
                                        } else {  /* no room so create dummy domain and NOS string */
-                                               ses->serverDomain = cifs_kcalloc(2, GFP_KERNEL);
-                                               ses->serverNOS = cifs_kcalloc(2, GFP_KERNEL);
+                                               ses->serverDomain = kcalloc(1, 2, GFP_KERNEL);
+                                               ses->serverNOS = kcalloc(1, 2, GFP_KERNEL);
                                        }
                                } else {        /* ASCII */
                                        len = strnlen(bcc_ptr, 1024);
                                        if (((long) bcc_ptr + len) - 
                         (long) pByteArea(smb_buffer_response) 
                             <= BCC(smb_buffer_response)) {
-                                               ses->serverOS = cifs_kcalloc(len + 1,GFP_KERNEL);
+                                               ses->serverOS = kcalloc(1, len + 1,GFP_KERNEL);
                                                strncpy(ses->serverOS,bcc_ptr, len);
 
                                                bcc_ptr += len;
                                                bcc_ptr++;
 
                                                len = strnlen(bcc_ptr, 1024);
-                                               ses->serverNOS = cifs_kcalloc(len+1,GFP_KERNEL);
+                                               ses->serverNOS = kcalloc(1, len+1,GFP_KERNEL);
                                                strncpy(ses->serverNOS, bcc_ptr, len);  
                                                bcc_ptr += len;
                                                bcc_ptr[0] = 0;
                                                bcc_ptr++;
 
                                                len = strnlen(bcc_ptr, 1024);
-                                               ses->serverDomain = cifs_kcalloc(len+1,GFP_KERNEL);
+                                               ses->serverDomain = kcalloc(1, len+1,GFP_KERNEL);
                                                strncpy(ses->serverDomain, bcc_ptr, len);
                                                bcc_ptr += len;
                                                bcc_ptr[0] = 0;
                                if(tcon->nativeFileSystem)
                                        kfree(tcon->nativeFileSystem);
                                tcon->nativeFileSystem =
-                                   cifs_kcalloc(length + 2, GFP_KERNEL);
+                                   kcalloc(1, length + 2, GFP_KERNEL);
                                cifs_strfromUCS_le(tcon->nativeFileSystem,
                                                   (wchar_t *) bcc_ptr,
                                                   length, nls_codepage);
                                if(tcon->nativeFileSystem)
                                        kfree(tcon->nativeFileSystem);
                                tcon->nativeFileSystem =
-                                   cifs_kcalloc(length + 1, GFP_KERNEL);
+                                   kcalloc(1, length + 1, GFP_KERNEL);
                                strncpy(tcon->nativeFileSystem, bcc_ptr,
                                        length);
                        }