Mail Archives: djgpp-workers/2012/03/11/11:54:41
Please inspect the following code snippet taken from _get_cached_blksize()
of xstat.c:
-- code start --
  if (!cache_blksize[d])
  {
    if (_is_remote_drive(d))  /* A = 0, B = 1, C = 2,  etc. */
    {
      /* Default remote drives to 4K block size, to improve performance.
       *
       * Also the size returned by statfs() may not be correct. Testing
       * against files shared by Samba 2.0.10 on Linux kernel 2.2.19
       * returned a 32K block size, even though the ext2 filesystem
       * holding the share share had a 4K block size. */
      cache_blksize[d] = 4096;
    }
    else
    {
      /* No entry => retrieve cluster size */
      if (statfs(path, &sbuf) != 0)
      {
        /* Failed, pass error through */
        return -1;
      }
      cache_blksize[d] = sbuf.f_bsize;
    }
  }
-- code end --
If _is_remote_drive returns with a value different from 0 then cache_blksize[d]
is set to 4096.  The issue is that _is_remote_drive may return with 1 if d is a
remote drive but also it may return with -1 if the function fails for drive
number d.  In both cases cache_blksize[d] = 4096.  The question arises if this
is a bug or a feature?  Drive "d" does not exist but a valid block size is 
assigned to cache_blksize[d] at the same time the errno (= ENODEV) set by
_is_remote_drive may get lost in future operations.
Regards,
Juan M. Guerrero
- Raw text -