Am 25.06.2013 um 14:05 hat Richard W.M. Jones geschrieben: > On Tue, Jun 25, 2013 at 01:39:11PM +0200, Kevin Wolf wrote: > > * ssh - currently has_zero_init = 1 (is this correct?) > [...] > > It might be possible that the correct value depends on the backend on > > the server side for some protocols - for example, I think for SSH it > > depends on whether you access a regular file or a block device on the > > other host (if accessing a block device is even possible). > > This seems to depend on the behaviour of O_TRUNC on block devices. > The man page says it's unspecified, but I tested it on Linux, and > Linux ignores it (for logical volumes anyway). > > When the ssh driver is asked to do bdrv_create it does on the > remote end: > > - open (filename, O_RDWR|O_CREAT|O_TRUNC, 0644) [1] > - lseek (fd, size-1, SEEK_SET) [2] > - write (fd, &'\0', 1) > > In other words for regular files, it creates a sparse file. For block > devices, I tested the sequence above, and it doesn't fail. > > So .. I guess that has_zero_init = 0 would be correct?
Yes, that's my understanding. > Unless we fstat the fd after opening it and return some conditional > value from bdrv_has_zero_init eg if it's a block device. Is that > possible? .bdrv_has_zero_init is a callback that gets a specific BlockDriverState, so it's possible to do some checks in there. If you can get the necessary information using SSH, doing it dynamically is certainly an option. Kevin