[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#6237: 23.2; INSUFFICIENT RESOURCES writing file via CIFS
From: |
Eli Zaretskii |
Subject: |
bug#6237: 23.2; INSUFFICIENT RESOURCES writing file via CIFS |
Date: |
Sat, 22 May 2010 12:39:41 +0300 |
> Date: Sat, 22 May 2010 11:38:35 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: 6237@debbugs.gnu.org
>
> > I know nothing about Windows internals, but it would seem that some
> > downstream WinNT I/O routine can't handle 32MB or larger writes, so
> > perhaps write-region could segment the write? The annotations hair
> > makes it hard for me to see if this is easy.
>
> The breaking of writes into smaller chunks should be in Windows
> specific code, i.e. in w32.c:sys_write. And that is very easy.
If you can build Emacs yourself from sources, could you please try the
following patch? It incorporates the info I found in the git mailing
list thread pointed out by Andreas (thanks!).
=== modified file 'src/w32.c'
--- src/w32.c 2010-05-01 18:28:00 +0000
+++ src/w32.c 2010-05-22 09:33:53 +0000
@@ -5700,7 +5700,34 @@ sys_write (int fd, const void * buffer,
}
else
#endif
- nchars = _write (fd, buffer, count);
+ {
+ /* Some networked filesystems don't like too large writes, so
+ break them into smaller chunks. See the Comments section of
+ the MSDN documentation of WriteFile for details behind the
+ choice of the value of CHUNK below. See also the thread
+ http://thread.gmane.org/gmane.comp.version-control.git/145294
+ in the git mailing list. */
+ const unsigned char *p = buffer;
+ const unsigned chunk = 30 * 1024 * 1024;
+
+ nchars = 0;
+ while (count > 0)
+ {
+ unsigned this_chunk = count < chunk ? count : chunk;
+ int n = _write (fd, p, this_chunk);
+
+ nchars += n;
+ if (n < 0)
+ {
+ nchars = n;
+ break;
+ }
+ else if (n < this_chunk)
+ break;
+ count -= n;
+ p += n;
+ }
+ }
return nchars;
}