Il 09/03/2012 21:36, Richard Laager ha scritto: > fallocate() only supports files. In my patch, I was fstat()ing the fd > just after opening it and caching an is_device boolean. Then, when doing > discards, if !is_device, call fallocate(), else (i.e. for devices) do > the following (note: untested code): > > __uint64_t range[2]; > > range[0] = sector_num << 9; > range[1] = (__uint64_t)nb_sectors << 9; > > if (ioctl(s->fd, BLKDISCARD, &range) && errno != EOPNOTSUPP) { > return -errno; > } > return 0;
You can instead put this code in a separate function hdev_discard. hdev device is used instead of file when the backend is a special file (block or character). > -------- sync requirements -------- > > I'm not sure if fallocate() and/or BLKDISCARD always guarantee that the > discard has made it to stable storage. If they don't, does O_DIRECT or > O_DSYNC on open() cause them to make any such guarantee? O_DIRECT shouldn't have any effect; for O_DSYNC I don't think so. > -------- Thin vs. Thick Provisioning -------- > > On Fri, 2012-03-09 at 00:35 -0800, Chris Wedgwood wrote: >> Simplest still compare the blocks allocated by the file >> to it's length (ie. stat.st_blocks != stat.st_size>>9). > > I thought of this as well. It covers "99%" of the cases, but there's one > case where it breaks down. Imagine I have a sparse file backing my > virtual disk. In the guest, I fill the virtual disk 100%. Then, I > restart QEMU. Now it thinks that sparse file is non-sparse and stops > issuing hole punches. I would not really have any problem with that, it seems like a relatively minor case (also because newer guests will allocate the first partition at 1 MB, so you might still have a small hole at the beginning). > To be completely correct, I suggest the following behavior: > 1. Add a discard boolean option to the disk layer. > 2. If discard is not specified: > * For files, detect a true/false value by comparing > stat.st_blocks != stat.st_size>>9. > * For devices, assume a fixed value (true?). > 3. If discard is true, issue discards. > 4. If discard is false, do not issue discards. The problem is, who will use this interface? Paolo