1*21c1c48aSSascha Wildner /* 2*21c1c48aSSascha Wildner * Copyright (c)2004 The DragonFly Project. All rights reserved. 3*21c1c48aSSascha Wildner * 4*21c1c48aSSascha Wildner * Redistribution and use in source and binary forms, with or without 5*21c1c48aSSascha Wildner * modification, are permitted provided that the following conditions 6*21c1c48aSSascha Wildner * are met: 7*21c1c48aSSascha Wildner * 8*21c1c48aSSascha Wildner * Redistributions of source code must retain the above copyright 9*21c1c48aSSascha Wildner * notice, this list of conditions and the following disclaimer. 10*21c1c48aSSascha Wildner * 11*21c1c48aSSascha Wildner * Redistributions in binary form must reproduce the above copyright 12*21c1c48aSSascha Wildner * notice, this list of conditions and the following disclaimer in 13*21c1c48aSSascha Wildner * the documentation and/or other materials provided with the 14*21c1c48aSSascha Wildner * distribution. 15*21c1c48aSSascha Wildner * 16*21c1c48aSSascha Wildner * Neither the name of the DragonFly Project nor the names of its 17*21c1c48aSSascha Wildner * contributors may be used to endorse or promote products derived 18*21c1c48aSSascha Wildner * from this software without specific prior written permission. 19*21c1c48aSSascha Wildner * 20*21c1c48aSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*21c1c48aSSascha Wildner * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*21c1c48aSSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*21c1c48aSSascha Wildner * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24*21c1c48aSSascha Wildner * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 25*21c1c48aSSascha Wildner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26*21c1c48aSSascha Wildner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27*21c1c48aSSascha Wildner * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28*21c1c48aSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29*21c1c48aSSascha Wildner * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30*21c1c48aSSascha Wildner * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 31*21c1c48aSSascha Wildner * OF THE POSSIBILITY OF SUCH DAMAGE. 32*21c1c48aSSascha Wildner */ 33*21c1c48aSSascha Wildner 34*21c1c48aSSascha Wildner /* 35*21c1c48aSSascha Wildner * diskutil.h 36*21c1c48aSSascha Wildner * $Id: diskutil.h,v 1.14 2005/02/07 06:41:42 cpressey Exp $ 37*21c1c48aSSascha Wildner */ 38*21c1c48aSSascha Wildner 39*21c1c48aSSascha Wildner #include <stdio.h> 40*21c1c48aSSascha Wildner 41*21c1c48aSSascha Wildner #ifndef __DISKUTIL_H_ 42*21c1c48aSSascha Wildner #define __DISKUTIL_H_ 43*21c1c48aSSascha Wildner 44*21c1c48aSSascha Wildner #include "functions.h" 45*21c1c48aSSascha Wildner 46*21c1c48aSSascha Wildner /*** TYPES ***/ 47*21c1c48aSSascha Wildner 48*21c1c48aSSascha Wildner struct storage; 49*21c1c48aSSascha Wildner struct disk; 50*21c1c48aSSascha Wildner struct slice; 51*21c1c48aSSascha Wildner struct subpartition; 52*21c1c48aSSascha Wildner 53*21c1c48aSSascha Wildner #define FS_HAMMER 0 54*21c1c48aSSascha Wildner #define FS_UFS 1 55*21c1c48aSSascha Wildner 56*21c1c48aSSascha Wildner #ifdef NEEDS_DISKUTIL_STRUCTURE_DEFINITIONS 57*21c1c48aSSascha Wildner 58*21c1c48aSSascha Wildner struct storage { 59*21c1c48aSSascha Wildner struct disk *disk_head; 60*21c1c48aSSascha Wildner struct disk *disk_tail; 61*21c1c48aSSascha Wildner struct disk *selected_disk; 62*21c1c48aSSascha Wildner struct slice *selected_slice; 63*21c1c48aSSascha Wildner unsigned long ram; /* amount of physical memory in MB */ 64*21c1c48aSSascha Wildner }; 65*21c1c48aSSascha Wildner 66*21c1c48aSSascha Wildner struct disk { 67*21c1c48aSSascha Wildner struct disk *next; 68*21c1c48aSSascha Wildner struct disk *prev; 69*21c1c48aSSascha Wildner struct slice *slice_head; 70*21c1c48aSSascha Wildner struct slice *slice_tail; 71*21c1c48aSSascha Wildner char *desc; /* from whereever we get the best */ 72*21c1c48aSSascha Wildner char *device; /* `ad0', `da1', and such */ 73*21c1c48aSSascha Wildner int cylinders; /* geometry information */ 74*21c1c48aSSascha Wildner int heads; 75*21c1c48aSSascha Wildner int sectors; /* (sectors per track) */ 76*21c1c48aSSascha Wildner long capacity; /* capacity in megabytes */ 77*21c1c48aSSascha Wildner int we_formatted; /* did we format it ourselves? */ 78*21c1c48aSSascha Wildner }; 79*21c1c48aSSascha Wildner 80*21c1c48aSSascha Wildner struct slice { 81*21c1c48aSSascha Wildner struct disk *parent; 82*21c1c48aSSascha Wildner struct slice *next; 83*21c1c48aSSascha Wildner struct slice *prev; 84*21c1c48aSSascha Wildner struct subpartition *subpartition_head; 85*21c1c48aSSascha Wildner struct subpartition *subpartition_tail; 86*21c1c48aSSascha Wildner char *desc; /* description (w/sysid string) */ 87*21c1c48aSSascha Wildner int number; /* 1 - 4 (or more?) (from fdisk) */ 88*21c1c48aSSascha Wildner unsigned long start; /* start sector (from fdisk) */ 89*21c1c48aSSascha Wildner unsigned long size; /* size in sectors (from fdisk) */ 90*21c1c48aSSascha Wildner int type; /* sysid of slice (from fdisk) */ 91*21c1c48aSSascha Wildner int flags; /* flags (from fdisk) */ 92*21c1c48aSSascha Wildner unsigned long capacity; /* capacity in megabytes */ 93*21c1c48aSSascha Wildner }; 94*21c1c48aSSascha Wildner 95*21c1c48aSSascha Wildner struct subpartition { 96*21c1c48aSSascha Wildner struct slice *parent; 97*21c1c48aSSascha Wildner struct subpartition *next; 98*21c1c48aSSascha Wildner struct subpartition *prev; 99*21c1c48aSSascha Wildner char letter; /* 'a' = root partition */ 100*21c1c48aSSascha Wildner char *mountpoint; /* includes leading slash */ 101*21c1c48aSSascha Wildner long capacity; /* in megabytes, -1 = "rest of disk" */ 102*21c1c48aSSascha Wildner int softupdates; 103*21c1c48aSSascha Wildner long fsize; /* fragment size */ 104*21c1c48aSSascha Wildner long bsize; /* block size */ 105*21c1c48aSSascha Wildner int is_swap; 106*21c1c48aSSascha Wildner int mfsbacked; /* Memory File System Backed */ 107*21c1c48aSSascha Wildner int type; /* FS type (UFS, HAMMER) */ 108*21c1c48aSSascha Wildner int pfs; /* HAMMER pseudo file system */ 109*21c1c48aSSascha Wildner }; 110*21c1c48aSSascha Wildner 111*21c1c48aSSascha Wildner #endif /* NEEDS_DISKUTIL_STRUCTURE_DEFINITIONS */ 112*21c1c48aSSascha Wildner 113*21c1c48aSSascha Wildner /*** PROTOTYPES ***/ 114*21c1c48aSSascha Wildner 115*21c1c48aSSascha Wildner struct storage *storage_new(void); 116*21c1c48aSSascha Wildner void storage_free(struct storage *); 117*21c1c48aSSascha Wildner void storage_set_memsize(struct storage *, unsigned long); 118*21c1c48aSSascha Wildner unsigned long storage_get_memsize(const struct storage *); 119*21c1c48aSSascha Wildner struct disk *storage_disk_first(const struct storage *); 120*21c1c48aSSascha Wildner void storage_set_selected_disk(struct storage *, struct disk *); 121*21c1c48aSSascha Wildner struct disk *storage_get_selected_disk(const struct storage *); 122*21c1c48aSSascha Wildner void storage_set_selected_slice(struct storage *, struct slice *); 123*21c1c48aSSascha Wildner struct slice *storage_get_selected_slice(const struct storage *); 124*21c1c48aSSascha Wildner int storage_get_mfs_status(const char *, struct storage *); 125*21c1c48aSSascha Wildner 126*21c1c48aSSascha Wildner struct disk *disk_new(struct storage *, const char *); 127*21c1c48aSSascha Wildner struct disk *disk_find(const struct storage *, const char *); 128*21c1c48aSSascha Wildner struct disk *disk_next(const struct disk *); 129*21c1c48aSSascha Wildner void disks_free(struct storage *); 130*21c1c48aSSascha Wildner void disk_set_desc(struct disk *, const char *); 131*21c1c48aSSascha Wildner const char *disk_get_desc(const struct disk *); 132*21c1c48aSSascha Wildner const char *disk_get_device_name(const struct disk *); 133*21c1c48aSSascha Wildner const char *disk_get_raw_device_name(const struct disk *); 134*21c1c48aSSascha Wildner struct slice *disk_slice_first(const struct disk *); 135*21c1c48aSSascha Wildner void disk_set_formatted(struct disk *, int); 136*21c1c48aSSascha Wildner int disk_get_formatted(const struct disk *); 137*21c1c48aSSascha Wildner void disk_set_geometry(struct disk *, int, int, int); 138*21c1c48aSSascha Wildner void disk_get_geometry(const struct disk *, int *, int *, int *); 139*21c1c48aSSascha Wildner 140*21c1c48aSSascha Wildner struct slice *slice_new(struct disk *, int, int, int, 141*21c1c48aSSascha Wildner unsigned long, unsigned long); 142*21c1c48aSSascha Wildner struct slice *slice_find(const struct disk *, int); 143*21c1c48aSSascha Wildner struct slice *slice_next(const struct slice *); 144*21c1c48aSSascha Wildner int slice_get_number(const struct slice *); 145*21c1c48aSSascha Wildner const char *slice_get_desc(const struct slice *); 146*21c1c48aSSascha Wildner const char *slice_get_device_name(const struct slice *); 147*21c1c48aSSascha Wildner const char *slice_get_raw_device_name(const struct slice *); 148*21c1c48aSSascha Wildner unsigned long slice_get_capacity(const struct slice *); 149*21c1c48aSSascha Wildner unsigned long slice_get_start(const struct slice *); 150*21c1c48aSSascha Wildner unsigned long slice_get_size(const struct slice *); 151*21c1c48aSSascha Wildner int slice_get_type(const struct slice *); 152*21c1c48aSSascha Wildner int slice_get_flags(const struct slice *); 153*21c1c48aSSascha Wildner void slices_free(struct slice *); 154*21c1c48aSSascha Wildner struct subpartition *slice_subpartition_first(const struct slice *); 155*21c1c48aSSascha Wildner 156*21c1c48aSSascha Wildner struct subpartition *subpartition_new(struct slice *, const char *, long, 157*21c1c48aSSascha Wildner int, long, long, int); 158*21c1c48aSSascha Wildner struct subpartition *subpartition_new_hammer(struct slice *, const char *, long); 159*21c1c48aSSascha Wildner int subpartition_count(const struct slice *); 160*21c1c48aSSascha Wildner struct subpartition *subpartition_find(const struct slice *, const char *, ...); 161*21c1c48aSSascha Wildner struct subpartition *subpartition_of(const struct slice *, const char *, ...); 162*21c1c48aSSascha Wildner struct subpartition *subpartition_find_capacity(const struct slice *, long); 163*21c1c48aSSascha Wildner void subpartitions_free(struct slice *); 164*21c1c48aSSascha Wildner struct subpartition *subpartition_next(const struct subpartition *); 165*21c1c48aSSascha Wildner int subpartition_get_pfs(const struct subpartition *); 166*21c1c48aSSascha Wildner const char *subpartition_get_mountpoint(const struct subpartition *); 167*21c1c48aSSascha Wildner const char *subpartition_get_device_name(const struct subpartition *); 168*21c1c48aSSascha Wildner const char *subpartition_get_raw_device_name(const struct subpartition *); 169*21c1c48aSSascha Wildner char subpartition_get_letter(const struct subpartition *); 170*21c1c48aSSascha Wildner unsigned long subpartition_get_fsize(const struct subpartition *); 171*21c1c48aSSascha Wildner unsigned long subpartition_get_bsize(const struct subpartition *); 172*21c1c48aSSascha Wildner unsigned long subpartition_get_capacity(const struct subpartition *); 173*21c1c48aSSascha Wildner int subpartition_is_swap(const struct subpartition *); 174*21c1c48aSSascha Wildner int subpartition_is_softupdated(const struct subpartition *); 175*21c1c48aSSascha Wildner int subpartition_is_mfsbacked(const struct subpartition *); 176*21c1c48aSSascha Wildner 177*21c1c48aSSascha Wildner long measure_activated_swap(const struct i_fn_args *); 178*21c1c48aSSascha Wildner long measure_activated_swap_from_slice(const struct i_fn_args *, 179*21c1c48aSSascha Wildner const struct disk *, const struct slice *); 180*21c1c48aSSascha Wildner long measure_activated_swap_from_disk(const struct i_fn_args *, 181*21c1c48aSSascha Wildner const struct disk *); 182*21c1c48aSSascha Wildner 183*21c1c48aSSascha Wildner int survey_storage(struct i_fn_args *); 184*21c1c48aSSascha Wildner 185*21c1c48aSSascha Wildner #endif /* !__DISKUTIL_H_ */ 186