/* Like is_allocated_sectors, but if the buffer starts with a used sector, up to 'min' consecutive sectors containing zeros are ignored. This avoids breaking up write requests for only small sparse areas.  */
static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum, int min)
/* Like is_allocated_sectors, but if the buffer starts with a used sector, up to 'min' consecutive sectors containing zeros are ignored. This avoids breaking up write requests for only small sparse areas.  */
static int is_allocated_sectors_min(const uint8_t *buf, int n, int *pnum, int min)
{
    int ret;
    int num_checked, num_used;
    if (n < min) {
        min = n;
    }
    ret = is_allocated_sectors(buf, n, pnum);
    if (!ret) {
        return ret;
    }
    num_used = *pnum;
    buf += BDRV_SECTOR_SIZE * *pnum;
    n -= *pnum;
    num_checked = num_used;
    while (n > 0) {
        ret = is_allocated_sectors(buf, n, pnum);
        buf += BDRV_SECTOR_SIZE * *pnum;
        n -= *pnum;
        num_checked += *pnum;
        if (ret) {
            num_used = num_checked;
        } else if (*pnum >= min) {
            break;
        }
    }
    *pnum = num_used;
    return 1;
}