root/sys/dev/vndvar.h
/*      $NetBSD: vndvar.h,v 1.39 2025/02/13 01:33:21 gutteridge Exp $   */

/*-
 * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Jason R. Thorpe.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Copyright (c) 1988 University of Utah.
 * Copyright (c) 1990, 1993
 *      The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * the Systems Programming Group of the University of Utah Computer
 * Science Department.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * from: Utah $Hdr: fdioctl.h 1.1 90/07/09$
 *
 *      @(#)vnioctl.h   8.1 (Berkeley) 6/10/93
 */

#ifndef _SYS_DEV_VNDVAR_H_
#define _SYS_DEV_VNDVAR_H_

#include <sys/ioccom.h>
#include <sys/pool.h>

/*
 * Vnode disk pseudo-geometry information.
 */
struct vndgeom {
        u_int32_t       vng_secsize;    /* # bytes per sector */
        u_int32_t       vng_nsectors;   /* # data sectors per track */
        u_int32_t       vng_ntracks;    /* # tracks per cylinder */
        u_int32_t       vng_ncylinders; /* # cylinders per unit */
};

/*
 * Ioctl definitions for file (vnode) disk pseudo-device.
 */
struct vnd_ioctl {
        char            *vnd_file;      /* pathname of file to mount */
        int             vnd_flags;      /* flags; see below */
        struct vndgeom  vnd_geom;       /* geometry to emulate */
        unsigned int    vnd_osize;      /* (returned) size of disk */
        uint64_t        vnd_size;       /* (returned) size of disk */
};

/* vnd_flags */
#define VNDIOF_HASGEOM  0x01            /* use specified geometry */
#define VNDIOF_READONLY 0x02            /* as read-only device */
#define VNDIOF_FORCE    0x04            /* force close */
#define VNDIOF_FILEIO   0x08            /* have to use read/write */
#define VNDIOF_COMP     0x0400          /* must stay the same as VNF_COMP */

#ifdef _KERNEL

struct vnode;

/*
 * A vnode disk's state information.
 */
struct vnd_softc {
        device_t         sc_dev;
        int              sc_flags;      /* flags */
        uint64_t         sc_size;       /* size of vnd */
        struct vnode    *sc_vp;         /* vnode */
        u_int            sc_iosize;     /* smallest I/O size for backend */
        kauth_cred_t     sc_cred;       /* credentials */
        int              sc_maxactive;  /* max # of active requests */
        struct bufq_state *sc_tab;      /* transfer queue */
        int              sc_pending;    /* number of pending transfers */
        int              sc_active;     /* number of active transfers */
        struct disk      sc_dkdev;      /* generic disk device info */
        struct vndgeom   sc_geom;       /* virtual geometry */
        struct pool      sc_vxpool;     /* vndxfer pool */
        struct pool      sc_vbpool;     /* vndbuf pool */
        struct lwp      *sc_kthread;    /* kernel thread */
        u_int32_t        sc_comp_blksz; /* precompressed block size */
        u_int32_t        sc_comp_numoffs;/* count of compressed block offsets */
        u_int64_t       *sc_comp_offsets;/* file idx's to compressed blocks */
        unsigned char   *sc_comp_buff;  /* compressed data buffer */
        unsigned char   *sc_comp_decombuf;/* decompressed data buffer */
        int32_t          sc_comp_buffblk;/*current decompressed block */
        z_stream         sc_comp_stream;/* decompress descriptor */
};
#endif

/* sc_flags */
#define VNF_INITED      0x001   /* unit has been initialized */
#define VNF_WLABEL      0x002   /* label area is writable */
#define VNF_LABELLING   0x004   /* unit is currently being labelled */
#define VNF_WANTED      0x008   /* someone is waiting to obtain a lock */
#define VNF_LOCKED      0x010   /* unit is locked */
#define VNF_READONLY    0x020   /* unit is read-only */
#define VNF_KLABEL      0x040   /* keep label on close */
#define VNF_VLABEL      0x080   /* label is valid */
#define VNF_KTHREAD     0x100   /* thread is running */
#define VNF_VUNCONF     0x200   /* device is unconfiguring */
#define VNF_COMP        0x400   /* file is compressed */
#define VNF_CLEARING    0x800   /* unit is being torn down */
#define VNF_USE_VN_RDWR 0x1000  /* have to use vn_rdwr() */

/* structure of header in a compressed file */
struct vnd_comp_header {
        char preamble[128];
        u_int32_t block_size;
        u_int32_t num_blocks;
};

/*
 * A simple structure for describing which vnd units are in use.
 */

struct vnd_user {
        int             vnu_unit;       /* which vnd unit */
        dev_t           vnu_dev;        /* file is on this device... */
        ino_t           vnu_ino;        /* ...at this inode */
};

/*
 * Before you can use a unit, it must be configured with VNDIOCSET.
 * The configuration persists across opens and closes of the device;
 * a VNDIOCCLR must be used to reset a configuration.  An attempt to
 * VNDIOCSET an already active unit will return EBUSY.
 */
#define VNDIOCSET       _IOWR('F', 0, struct vnd_ioctl) /* enable disk */
#define VNDIOCCLR       _IOW('F', 1, struct vnd_ioctl)  /* disable disk */
#define VNDIOCGET       _IOWR('F', 3, struct vnd_user)  /* get list */

#ifdef _KERNEL
/*
 * Everything else is kernel-private, mostly exported for compat/netbsd32.
 *
 * NetBSD 3.0 had a 32-bit value for vnu_ino.
 *
 * NetBSD 5.0 had a 32-bit value for vnu_dev, and vnd_size.
 */
struct vnd_user30 {
        int             vnu_unit;       /* which vnd unit */
        uint32_t        vnu_dev;        /* file is on this device... */
        uint32_t        vnu_ino;        /* ...at this inode */
};
#define VNDIOCGET30     _IOWR('F', 2, struct vnd_user30)        /* get list */

struct vnd_user50 {
        int             vnu_unit;       /* which vnd unit */
        uint32_t        vnu_dev;        /* file is on this device... */
        ino_t           vnu_ino;        /* ...at this inode */
};
#define VNDIOCGET50     _IOWR('F', 3, struct vnd_user50)        /* get list */

struct vnd_ioctl50 {
        char            *vnd_file;      /* pathname of file to mount */
        int             vnd_flags;      /* flags; see below */
        struct vndgeom  vnd_geom;       /* geometry to emulate */
        unsigned int    vnd_size;       /* (returned) size of disk */
};
#define VNDIOCSET50     _IOWR('F', 0, struct vnd_ioctl50)
#define VNDIOCCLR50     _IOW('F', 1, struct vnd_ioctl50)

#endif /* _KERNEL */

#endif /* _SYS_DEV_VNDVAR_H_ */