8.14. SG_SET_RESERVED_SIZE (和 _GET_ )

SG_SET_RESERVED_SIZE 0x2275 [_GET_ 0x2272]。 这两个 ioctl() 都假定第 3 个参数指向一个 int 类型。

对于 ioctl(SG_SET_RESERVED_SIZE),该值将用于请求一个新的指定大小的预留缓冲区。之前的预留缓冲区将被释放(如果它没有被使用;如果它正在被使用,则 ioctl() 将会失败,并且 errno 中会设置 EBUSY)。然后会分配一个新的预留缓冲区,并且可以通过调用 ioctl(SG_GET_RESERVED_SIZE) 来找到它的实际大小。如果预留缓冲区没有被使用,并且 write() 调用请求的缓冲区大小不大于预留缓冲区的大小,那么后续的 write() 和 ioctl(SG_IO) 命令将会使用这个预留缓冲区进行 DMA 操作。如果适配器支持分散-聚集,那么预留缓冲区可能是一系列内核缓冲区。可以请求较大的缓冲区(例如 4 MB),但不一定会被授予。一旦在 sg 文件描述符上进行了 mmap() 调用,后续对此 ioctl() 的调用将会失败,并且 errno 中会设置 EBUSY。

对于 ioctl(SG_GET_RESERVED_SIZE),结果是从 open() 或最近一次对此文件描述符 (fd) 调用 SG_SET_RESERVED_SIZE ioctl() 时预留缓冲区的字节大小。如果内存非常紧张,结果可能为 0。在这种情况下,尝试在此文件描述符上执行类似刻录 CD 的操作可能不明智。