[Samba] Re: vfat / ftruncate problem
Uli Luckas
luckas at musoft.de
Fri Apr 11 15:51:38 GMT 2003
Am Fre, 2003-04-11 um 16.44 schrieb Tom Schaefer:
> I modified the the source code of vfs-wrap.c, in particular this section:
>
> result = sys_ftruncate(fd, len);
> if (result == 0)
> goto done;
>
> to
>
> /*result = sys_ftruncate(fd, len);
> if (result == 0)*/
> result = 0;
> goto done;
>
> recompiled smbd, put the new binary in place, restarted samba and lo and behold it worked! Now I can copy my 750Meg test file from Windows98SE Windows Explorer to a samba shared vfat partition and the copy starts immediately and completes successfully after a minute or two.
>
> So, now my question is - What kind of problem(s) if any am I setting myself up for by doing this?
So here you skip all truncate requests where sys_ftruncate does not
succeede. This does not look like a good idea. I guess there usually is
a reason for a function to be called in the first place.
But let's look at your specific situation. There are two kind's of
truncates. An expandig and a shrinking. From the comments in the source
I take it that VFAT truncates work for shrinking but not for expanding.
So at least you can still shrink files.
When Windows tries to copy a file it seems to expand the destination to
it's final size first. I guess this is just to avoid fragmentation and
to avoid writing 90% of a huge file before failing. So you seem to be
safe in this situation.
An application on the client could choose to ftruncate-expand an empty
file to 4k just to be abel to read 4096 zeros out of it :-) This is
absolutely legal and would fail, as the file would never be
ftruncate-expanded with your modifications.
Honestly, databases do this kind of stuff. And I would not be surprised
if MS-Office apps would use this feature. I can't come up with an
example where bytes beyond the last written byte are ever being read,
but I would not rely on it to never happen.
A much safer Idea would be to skip truncating, returning an error. Maybe
Windows can deal with failing truncates.
Try:
result = sys_ftruncate(fd, len);
/* if (result == 0) */
goto done;
Regards
Uli
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Dies ist ein digital signierter Nachrichtenteil
Url : http://lists.samba.org/archive/samba/attachments/20030411/35d9eac7/attachment.bin
More information about the samba
mailing list