lofi.h revision 6f02aa444eb77edda1b97ff8a1215c417932a62e
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_LOFI_H
#define _SYS_LOFI_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* /dev names:
*/
#define LOFI_DRIVER_NAME "lofi"
#define LOFI_CTL_NODE "ctl"
#define LOFI_BLOCK_NAME LOFI_DRIVER_NAME
#define SEGHDR 1
#define COMPRESSED 1
#define UNCOMPRESSED 0
#define MAXALGLEN 36
/*
*
* Use is:
*
* lofi must be opened exclusively. Access is controlled by permissions on
* the device, which is 644 by default. Write-access is required for ioctls
* that change state, but only read-access is required for the ioctls that
* return information. Basically, only root can add and remove files, but
* non-root can look at the current lists.
*
* ioctl usage:
*
* kernel ioctls
*
* strcpy(li.li_filename, "somefilename");
* ioctl(ld, LOFI_MAP_FILE, &li);
* newminor = li.li_minor;
*
* strcpy(li.li_filename, "somefilename");
* ioctl(ld, LOFI_UNMAP_FILE, &li);
*
* strcpy(li.li_filename, "somefilename");
* li.li_minor = minor_number;
* ioctl(ld, LOFI_MAP_FILE_MINOR, &li);
*
* li.li_minor = minor_number;
* ioctl(ld, LOFI_UNMAP_FILE_MINOR, &li);
*
* li.li_minor = minor_number;
* ioctl(ld, LOFI_GET_FILENAME, &li);
*
* strcpy(li.li_filename, "somefilename");
* ioctl(ld, LOFI_GET_MINOR, &li);
*
* li.li_minor = 0;
* ioctl(ld, LOFI_GET_MAXMINOR, &li);
* maxminor = li.li_minor;
*
* strcpy(li.li_filename, "somefilename");
* li.li_minor = 0;
* ioctl(ld, LOFI_CHECK_COMPRESSED, &li);
*
* If the 'li_force' flag is set for any of the LOFI_UNMAP_* commands, then if
* the device is busy, the underlying vnode will be closed, and any subsequent
* operations will fail. It will behave as if the device had been forcibly
* removed, so the DKIOCSTATE ioctl will return DKIO_DEV_GONE. When the device
* is last closed, it will be torn down.
*
* If the 'li_cleanup' flag is set for any of the LOFI_UNMAP_* commands, then
* if the device is busy, it is marked for removal at the next time it is
* no longer held open by anybody. When the device is last closed, it will be
* torn down.
*
* Oh, and last but not least: these ioctls are totally private and only
* for use by lofiadm(1M).
*
*/
struct lofi_ioctl {
char li_filename[MAXPATHLEN];
char li_algorithm[MAXALGLEN];
};
/*
* file types that might be usable with lofi, maybe. Only regular
* files are documented though.
*/
#define S_ISLOFIABLE(mode) \
#if defined(_KERNEL)
/*
* We limit the maximum number of active lofi devices to 128, which seems very
* If you change it dynamically, which you probably shouldn't do, make sure
* to only _increase_ it.
*/
#define LOFI_MAX_FILES 128
extern uint32_t lofi_max_files;
#define V_ISLOFIABLE(vtype) \
struct lofi_state {
char *ls_filename; /* filename to open */
int ls_openflag;
/* the following fields are required for compression support */
int ls_comp_algorithm_index; /* idx into compress_table */
char ls_comp_algorithm[MAXALGLEN];
};
#endif /* _KERNEL */
/*
* Common signature for all lofi compress functions
*/
/*
* Information about each compression function
*/
typedef struct lofi_compress_info {
int l_level;
char *l_name; /* algorithm name */
enum lofi_compress {
LOFI_COMPRESS_GZIP = 0,
LOFI_COMPRESS_GZIP_6 = 1,
LOFI_COMPRESS_GZIP_9 = 2,
};
#ifdef __cplusplus
}
#endif
#endif /* _SYS_LOFI_H */