home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / update701 / root.17 / etc / conf / pack.d / vol / space.c / space
Text File  |  1998-08-18  |  19KB  |  590 lines

  1. /*
  2.  * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  3.  *                                                                         
  4.  *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  5.  *                   SANTA CRUZ OPERATION INC.                             
  6.  *                                                                         
  7.  *   The copyright notice above does not evidence any actual or intended   
  8.  *   publication of such source code.                                      
  9.  */
  10.  
  11. /* @(#)uts.vxvm:vxvm/unixware/Space.c    1.5.2.2 11/25/97 17:38:51 - %Q */
  12. #ident    "@(#)uts.vxvm:vxvm/unixware/Space.c    1.5.3.1"
  13.  
  14. /*
  15.  * Copyright(C)1996 VERITAS Software Corporation.  ALL RIGHTS RESERVED.
  16.  * UNPUBLISHED -- RIGHTS RESERVED UNDER THE COPYRIGHT
  17.  * LAWS OF THE UNITED STATES.  USE OF A COPYRIGHT NOTICE
  18.  * IS PRECAUTIONARY ONLY AND DOES NOT IMPLY PUBLICATION
  19.  * OR DISCLOSURE.
  20.  * 
  21.  * THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND
  22.  * TRADE SECRETS OF VERITAS SOFTWARE.  USE, DISCLOSURE,
  23.  * OR REPRODUCTION IS PROHIBITED WITHOUT THE PRIOR
  24.  * EXPRESS WRITTEN PERMISSION OF VERITAS SOFTWARE.
  25.  * 
  26.  *               RESTRICTED RIGHTS LEGEND
  27.  * USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT IS
  28.  * SUBJECT TO RESTRICTIONS AS SET FORTH IN SUBPARAGRAPH
  29.  * (C) (1) (ii) OF THE RIGHTS IN TECHNICAL DATA AND
  30.  * COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013.
  31.  *               VERITAS SOFTWARE
  32.  * 1600 PLYMOUTH STREET, MOUNTAIN VIEW, CA 94043
  33.  */
  34. #define UW_2_1
  35.  
  36. #ifndef _FSKI
  37. #define    _FSKI    1
  38. #endif
  39.  
  40. #include    "config.h"
  41.  
  42. #include    "sys/ksynch.h"
  43. #include    "sys/conf.h"
  44. #include    "sys/param.h"
  45. #include    "sys/vtoc.h"
  46.  
  47. #include    "vxvm/voldefs.h"
  48. #include    "vxvm/vollocks.h"
  49. #include    "vxvm/vollocal.h"
  50. #include    "vxvm/voldefault.h"
  51. #include    "vxvm/volioctl.h"
  52. #include    "vxvm/voldioctl.h"
  53. #include    "vxvm/volstats.h"
  54. #include    "vxvm/volkern.h"
  55. #include    "vxvm/voliomem.h"
  56. #include    "vxvm/volkio.h"
  57. #include    "vxvm/volsio.h"
  58.  
  59. #ifdef SOLARIS
  60. #ifdef SOLARIS_2_5
  61. #include      <sys/promimpl.h>
  62. #else /* !SOLARIS_2_5 */
  63. #include      <sys/promcommon.h>
  64. #endif /* SOLARIS_2_5 */
  65. #endif /* SOLARIS */
  66.  
  67. /*
  68.  *
  69.  * parameters controlling root and swap volumes:
  70.  *
  71.  *      NO_SASSIGN
  72.  *              Define stub values for vol_rootdev_is_volume and
  73.  *              vol_swapdev_is_volume, so to avoid link problems when
  74.  *              the volume manager kernel drivers are loadable.
  75.  *              Normally, these variables are set from an sassign.d
  76.  *              file, but sassign.d files are not used for loadable
  77.  *              drivers.
  78.  *
  79.  *      VOL_ROOTDEV_IS_VOLUME
  80.  *      VOL_SWAPDEV_IS_VOLUME
  81.  *              Indicate the the root/swap file systems are volumes.
  82.  *              This enables the automatic configuration of volumes
  83.  *              with minor numbers 0 and 1, at boot time, as direct
  84.  *              read-only pass-through volumes to the devices defined
  85.  *              by vol_rootvol_dev, and vol_swapvol_dev.
  86.  *
  87.  * NOTE: These parameters are modified automatically by installation
  88.  *       scripts.
  89.  */
  90.  
  91. /*
  92.  * If required some of the #defines used here can be converted to
  93.  * a variable so that it can be set through the /etc/system file on
  94.  * Solaris.
  95.  */
  96. #define VOL_NO_SASSIGN
  97. #undef VOL_ROOTDEV_IS_VOLUME
  98. #undef VOL_SWAPDEV_IS_VOLUME
  99.  
  100. #ifdef VOL_NO_SASSIGN
  101. voldevno_t vol_rootvol_dev = VOLNODEV;    /* underlying root volume dev */
  102. voldevno_t vol_swapvol_dev = VOLNODEV;    /* underlying swap volume dev */
  103. #endif  /* VOL_NO_SASSIGN */
  104.  
  105. #ifdef SOLARIS
  106. int    vol_root_dev_maj = 0;    /* can be initialized in /etc/system */
  107. int    vol_root_dev_min = 0;    /* can be initialized in /etc/system */
  108. int    vol_swap_dev_maj = 0;    /* can be initialized in /etc/system */
  109. int    vol_swap_dev_min = 0;    /* can be initialized in /etc/system */
  110.  
  111. /* 
  112.  * vol_usrpart_is_volume indicates that device mounted on /usr 
  113.  * is a volume. vold knows about this through vol_is_usr field 
  114.  * in volinfo. The usr volume is started from vold when vold
  115.  * mode is set to boot. This is esential so that / can be 
  116.  * fscked and mounted read-write. 
  117.  */
  118. int    vol_usrpart_is_volume = 0;
  119. #endif /* SOLARIS */
  120.  
  121. #ifdef VOL_ROOTDEV_IS_VOLUME
  122. int     vol_rootdev_is_volume = 1;
  123. #else
  124. int     vol_rootdev_is_volume = 0;
  125. #endif /* VOL_ROOTDEV_IS_VOLUME */
  126.  
  127. #ifdef VOL_SWAPDEV_IS_VOLUME
  128. int     vol_swapdev_is_volume = 1;
  129. #else
  130. int     vol_swapdev_is_volume = 0;
  131. #endif /* VOL_SWAPDEV_IS_VOLUME */
  132.  
  133. #ifdef SOLARIS
  134. /*
  135.  * for Solaris, only simple variables can be tuned, so define external
  136.  * variables for all tunables in the volinfo structure.
  137.  */
  138.  
  139. int vol_maxvol = MAX_VOL;
  140. int vol_subdisk_num = SUBDISK_NUM;
  141. int vol_maxioctl = VOL_MAXIOCTL;
  142. int vol_maxspecialio = VOL_MAXSPECIALIO;
  143. int vol_maxio = VOL_MAXIO;
  144. int vol_maxkiocount = VOL_MAXKIOCOUNT;
  145. int vol_default_iodelay = VOL_DEFAULT_IODELAY;
  146. int voldrl_min_regionsz = VOLDRL_MIN_REGIONSZ;
  147. int voldrl_max_drtregs = VOLDRL_MAX_DRTREGS;
  148. int vol_maxparallelio = VOL_MAXPARALLELIO;
  149. int vol_mvr_maxround = VOL_MVR_MAXROUND;
  150. int vol_maxstablebufsize = VOL_MAXSTABLEBUFSIZE;
  151. int voliot_iobuf_limit = VOLIOT_IOBUF_LIMIT;
  152. int voliot_iobuf_max = VOLIOT_IOBUF_MAX;
  153. int voliot_iobuf_default = VOLIOT_IOBUF_DEFAULT;
  154. int voliot_errbuf_default = VOLIOT_ERRBUF_DEFAULT;
  155. int voliot_max_open = VOLIOT_MAX_OPEN;
  156. int vol_checkpt_default = VOL_CHECKPT_DEFAULT;
  157. int volraid_rsrtransmax = VOLRAID_RSRTRANSMAX;
  158. #endif /* SOLARIS */
  159.  
  160. /*
  161.  * The volinfo structure
  162.  */
  163. struct volinfo volinfo = {
  164.     VOL_KERNEL_VERSION,            /* version */
  165.     VOL_PRIVMEM_MAX_ID,            /* max_volprivmem */
  166. #ifdef SOLARIS
  167.     /*
  168.      * On Solaris, these numbers are filled in at load time.
  169.      */
  170.     0,
  171.     0,
  172.     0,
  173. #else /* !SOLARIS */
  174. #ifndef VOL_BMAJOR_0
  175. #ifdef VOL_TESTING
  176.         0,
  177.         0,
  178.         0,
  179. #endif VOL_TESTING
  180. #else /* not !VOL_BMAJOR_0) */
  181.         VOL_BMAJOR_0,                           /* vol_bmajor */
  182.         VOL_CMAJOR_0,                           /* vol_cmajor */
  183. #ifdef PLEX_CMAJOR_0
  184.         PLEX_CMAJOR_0,                          /* plex_cmajor */
  185. #else
  186.         NODEV,                                  /* plex_cmajor */
  187. #endif /* PLEX_CMAJOR */
  188. #endif /* !VOL_BMAJOR_0 */
  189. #endif /* SOLARIS */
  190.     MAX_VOL,                /* max # of volumes */
  191.     MAX_PLEX,                /* max # of plexes */
  192.     PLEX_NUM,                /* max plexes per volume */
  193.     SUBDISK_NUM,                /* max sd's per plex */
  194.     VOL_MAXIOCTL,                /* max size of ioctl data */
  195.     VOL_MAXSPECIALIO,            /* max size of ioctl I/O ops */
  196.     VOL_MAXIO,                /* max I/O size in sectors */
  197.     VOL_MAXKIOCOUNT,            /* max # of concurrent I/Os */
  198.     VOL_DEFAULT_IODELAY,            /* default I/O delay - utils */
  199.     VOLDRL_MIN_REGIONSZ,            /* min DRL region size */
  200.     VOLDRL_MAX_DRTREGS,            /* max # of DRL dirty regs */
  201.     VOL_MAXPARALLELIO,            /* max # voldios allowed */
  202. #ifdef SOLARIS
  203.     0,                    /* root is not volume */
  204.     VOL_MVR_MAXROUND,            /* max round-robin reg. size */
  205.     0,                    /* prom version, filled in */
  206. #else   /* !SOLARIS */
  207.         0,                                      /* unused */
  208.         VOL_MVR_MAXROUND,                       /* max round-robin reg. size */
  209.         0,                                      /* unused */
  210. #endif  /* SOLARIS */
  211.     VOL_MAXSTABLEBUFSIZE,            /* max # of blocks for
  212.                            stable buf copies */
  213.     VOLIOT_IOBUF_LIMIT,            /* max total trace buf spc */
  214.     VOLIOT_IOBUF_MAX,            /* max size of I/O trace buf */
  215.     VOLIOT_IOBUF_DEFAULT,            /* default I/O trace buf sz */
  216.     VOLIOT_ERRBUF_DEFAULT,            /* default err trace buf sz */
  217.     VOLIOT_MAX_OPEN,            /* max # of trace channels */
  218.     VOL_CHECKPT_DEFAULT,            /* default checkpoint size */
  219.     VOLRAID_RSRTRANSMAX,            /* max # of transient RSRs */
  220. };
  221.  
  222. /*
  223.  * volkioq_start - queue of unstarted top-level I/Os
  224.  * volsioq_start - queue of I/O stages to start
  225.  * volsioq_idle_start - queue of I/O stages to start before iod goes to sleep
  226.  * volsioq_done - queue of I/O stage completions to process
  227.  *
  228.  * These three queues define the queues of work to perform immediately
  229.  * for the I/O daemons.
  230.  */
  231. struct volkioq volkioq_start;
  232. struct volsioq volsioq_start;
  233. struct volsioq volsioq_idle_start;
  234. struct volsioq volsioq_done;
  235.  
  236. /*
  237.  * volsioq_restart - queue of I/O stages to start later
  238.  * volsioq_redone - queue of I/O stage completions to process later
  239.  *
  240.  * These two queues define work queues to be processed the next time
  241.  * an I/O daemon wakes up.  Work that cannot be done immediately can
  242.  * be retried the next time an I/O daemon wakes up, on the presumption
  243.  * that letting the I/O daemons sleep for a short period of time may
  244.  * clear whatever condition makes processing temporarily impossible.
  245.  *
  246.  * NOTE: There is no volkioq_restart queue.  This is because iogen
  247.  *     functions cannot be deferred if VOLMEM_SLEEP is passed, so
  248.  *     an iogen function called from an I/O daemon cannot cause the
  249.  *     kio to be deferred.
  250.  */
  251. struct volsioq volsioq_restart;
  252. struct volsioq volsioq_redone;
  253.  
  254. /*
  255.  * volkioq_commitwait_start - top-level I/Os waiting for transaction commit
  256.  *
  257.  * Top-level I/Os that are blocked due to a transaction lock are put on
  258.  * this list.  When a transction commit completes, I/Os are moved from
  259.  * the volkioq_twait_start list to the volkioq_start list for
  260.  * processing by the I/O daemons.
  261.  */
  262. struct volkioq volkioq_commitwait_start;
  263.  
  264. #ifdef VOLSIO_DEBUG
  265. /*
  266.  * volsio_list - list of all SIOs on the system
  267.  * volsio_count - count of SIOs on volsio_list
  268.  * volsio_list_lock - lock for update access to volsio_list
  269.  *
  270.  * This list is managed only when the kernel is compiled with appropriate
  271.  * debugging options.  The VOLSIO_REGISTER() macro adds to this list,
  272.  * the VOLSIO_UNREGISTER() macro then deletes from the list.
  273.  */
  274.  
  275. struct volsio *volsio_list;
  276. size_t volsio_count;
  277. volfastlock_t volsio_list_lock;
  278. #endif    /* VOLSIO_DEBUG */
  279.  
  280. /*
  281.  * volopenclose_sleep - sleep lock for open/close serialization
  282.  *
  283.  * volopenenter, volcloseenter, and transactions obtain this lock to
  284.  * ensure open, close, and transaction serialization.
  285.  */
  286. volocsleep_t volopenclose_sleep;
  287.  
  288. /*
  289.  * volop_rwsleep - shared/exclusive sleep lock for operations
  290.  *
  291.  * volopenter obtains this lock for shared access.  Transactions
  292.  * obtain this lock for exclusive access.  This lock ensures that
  293.  * transactions happen with no operations in progress.
  294.  */
  295. volrwsleep_t volop_rwsleep;
  296.  
  297. /*
  298.  * volio_spin - spinlock to protect interactions with I/O daemons
  299.  *
  300.  * volkiostart obtains this lock before checking resources, getting
  301.  * virtual devices, and before incrementing volkiocount.  This lock is
  302.  * also obtained to manipulate the work lists for the I/O daemons.
  303.  */
  304. volspin_t volio_spin;
  305.  
  306. /*
  307.  * voliod_sync - wait lock for I/O daemons
  308.  *
  309.  * I/O daemons wait on this synchronization lock.  Daemons should be
  310.  * woken up when there is work to do.
  311.  */
  312. volsync_t voliod_sync;
  313.  
  314. /*
  315.  * volmapin_spin - spinlock to protect mapin limiting code.
  316.  */
  317. volspin_t vol_mapin_spin;
  318.  
  319. /*
  320.  * vol_mapin_reserve - Value of reservation space for bp_mapin currently
  321.  * in use.
  322.  */
  323. size_t vol_mapin_reserve;
  324.  
  325. /*
  326.  * volkioq_mapin - Q of kios waiting for bp_mapin space to be freed from the
  327.  * reservation pool.
  328.  */
  329. struct volkioq volkioq_mapin;
  330.  
  331. /*
  332.  * vol_bpsync_hash - Hash table of sync locks used to provide synchronization
  333.  * point for blocked kios waiting for bp_mapin space.  Hash list saves from
  334.  * allocating synclocks in the I/O path and saves from waking every sleeping
  335.  * kio for every kiodone().
  336.  */
  337. volsync_t vol_bpsync_hash[VOL_BPSYNC_NHASH];
  338.  
  339. /*
  340.  * volkiocount - count of top-level I/Os being processed
  341.  *
  342.  * This is incremented each time a top-level I/O is processed, and is
  343.  * decremented when each top-level I/O completes.  This is used
  344.  * to determine whether I/o daemons can be stopped.  I/O daemons will
  345.  * go away (due to reduction in the voliod_want_count variable) only
  346.  * if volkiocount is zero and the volkioq_start and commitwait_start
  347.  * queues are both empty.  The two volkioq_* lists are used to hold
  348.  * KIO's that are not yet being processed.  These two lists are not
  349.  * counted in volkiocount.
  350.  *
  351.  * volkiocount is also used to limit the number of KIO's that are
  352.  * being processed concurrently.  volkiocount is prevented from ever
  353.  * exceeding a threshold value stored in the volinfo structure.  A
  354.  * new KIO that would exceed the threshold is queued to the
  355.  * volkioq_start list.
  356.  */
  357. int volkiocount = 0;
  358.  
  359. /*
  360.  * volkio_overrun - set if too many KIOs are started
  361.  *
  362.  * If more than vol_maxkiocount KIOs are given to the system, then
  363.  * the additional KIOs are just queued onto the volkioq_start queue,
  364.  * and volkio_overrun is set.  When enough KIOs are done'd to cause
  365.  * volkiocount to drop below vol_maxkiocount, volkio_overrun is
  366.  * cleared and an I/O daemon is woken up to process the queued KIOs.
  367.  */
  368. int volkio_overrun = 0;
  369.  
  370. /*
  371.  * voliod_running - number of currently running I/O daemons
  372.  * voliod_need - indicate that an I/O daemon is needed
  373.  *
  374.  * These variables are used to avoid unnecessary wakeups on the I/O
  375.  * daemons.  voliod_running counts the number of I/O daemons
  376.  * that are currently running (that are not sleeping waiting for more
  377.  * work).  If voliod_running is non-zero, no wakeup is necessary.
  378.  *
  379.  * voliod_need is set to 1 whenever a wakeup is issued against the 
  380.  * I/O daemons, and is cleared whenever an I/O daemon wakes up to look
  381.  * for more work.  Thus, if voliod_need is 1, then a wakeup has
  382.  * already been issued, and further wakeups are not yet necessary.
  383.  */
  384. int voliod_running;
  385. int voliod_need;
  386.  
  387. /*
  388.  * voliod_count - count of I/O daemons
  389.  * voliod_want_count - count of desired I/O daemons
  390.  *
  391.  * These variables control the number of running I/O daemons.
  392.  * voliod_count is the number of I/O daemon processes that
  393.  * currently exist (not counting I/O daemons started to handle one
  394.  * particular I/O).  If this number exceeds voliod_want_count,
  395.  * then I/O daemons will start exiting until the number reaches
  396.  * voliod_want_count.  I/O daemons will exit only if there are no
  397.  * outstanding I/Os in the system.
  398.  */
  399. int voliod_count;
  400. int voliod_want_count;
  401.  
  402. /*
  403.  * vol_ktrans_klocks - list of lock buffers for the current transaction
  404.  * volkstate         - current transaction state
  405.  * vol_config_loaded - set to 1 after first successful transaction
  406.  * vol_commit_in_progress - set to 1 for duration of a transaction commit
  407.  */
  408. struct volktrans_klocks    *vol_ktrans_klocks = NULL;
  409. struct volktranstate    volkstate;
  410. int            vol_config_loaded = 0;
  411. int            vol_commit_in_progress = 0;
  412.  
  413. /*
  414.  * Global trace event number
  415.  */
  416. voleventno_t        voliot_eventno;
  417.  
  418. /*
  419.  * Other global vars
  420.  */
  421. pid_t            voldpid = 0;    /* pid of vold process, or 0 */
  422. void            *voldprocp;    /* proc pointer for vold process */
  423. volfastlock_t        voldpid_lock;    /* lock for voldpid */
  424.  
  425. struct voldevlist    *voldevlist;    /* list of volume devices */
  426. struct voldevlist    *volnewdevlist;    /* pending list of volume devices */
  427. struct voldevice    *vololddevices;    /* devices to be removed */
  428. struct voldg        *voldglist = NULL; /* list of disk groups */
  429. volfastlock_t        voldglist_lock;    /* disk group list lock */
  430. struct voldg        *vol_transdg;    /* dg for current transaction */
  431. struct voldg        vol_nulldg;    /* the null disk group */
  432.  
  433. struct volspec        volspec[MAXVSPEC];
  434.  
  435. /*
  436.  * volioctl_ktok_info - kernel-to-kernel volioctl_info structure
  437.  *
  438.  * VxVM kernel functions can point to this structure as the volioctl_info
  439.  * structure to use when calling other ioctl functions within the kernel,
  440.  * where the argument in the ioctl points to kernel space, not user space.
  441.  */
  442. struct volioctl_info volioctl_ktok_info = VOLIOCTL_KTOK_INFO;
  443.  
  444. /*
  445.  * Global objects for RAID
  446.  */
  447. struct volsioq    volraidrsrq;
  448. volfastlock_t    volraidrsr_spin;
  449. int        volraidrsr_transcnt;    /* transient RSR recovery count */
  450.  
  451. /*
  452.  * Device interface flag
  453.  */
  454. #ifdef UW_2_1
  455. int                     voldevflag = D_NEW | D_MP | D_NOBRKUP | D_LFS;
  456. #else
  457. int            voldevflag = D_NEW | D_DMA | D_NOBRKUP;
  458. #endif /* UW_2_1 */
  459.  
  460. /*
  461.  * Disk device information. Solaris systems fill this in at
  462.  * driver load time.
  463.  */
  464. #if defined(NO_SVR4_SDI) || defined(SOLARIS)
  465.  
  466. struct vol_diskdriver_info    vol_ddi_info;
  467. major_t            vol_ddi_cmajors[SD01_CMAJORS+1];
  468. major_t            vol_ddi_bmajors[SD01_CMAJORS+1];
  469.  
  470. #else /* !NO_SVR4_SDI && !SOLARIS */
  471.  
  472. static major_t vol_ddi_cmajors[] = {
  473.         7679,0
  474. };
  475.  
  476. static major_t vol_ddi_bmajors[] = {
  477.         7679,0
  478. };
  479.  
  480. /*
  481.  * NOTE: Post-BL11 Number of minors per major will be reduced from 512 to 256
  482.  */
  483. struct vol_diskdriver_info vol_ddi_info = {
  484.         256,
  485.         V_NUMPAR,
  486.         1,
  487.         vol_ddi_cmajors,
  488.         vol_ddi_bmajors,
  489. };
  490.  
  491. #endif /* NO_SVR4_SDI */
  492.  
  493. /*
  494.  * Maximum number of DRL dirty regions in sequential mode
  495.  */
  496. ulong_t        voldrl_max_seq_dirty = VOLDRL_MAX_SEQUENTIAL_DIRTY;
  497.  
  498. #if defined(VXVM_DEBUG)
  499. int    vol_mapin_hit = 0;
  500. int    vol_mapin_miss = 0;
  501. int    vol_mapin_wakeup = 0;
  502. #endif    /* VXVM_DEBUG */
  503.  
  504. /*
  505.  * vol_debug_level - determine which debugging messages should be printed
  506.  */
  507. #if defined(VXVM_DEBUG)
  508. int    vol_debug_level = 1;
  509. #else    /* not VXVM_DEBUG */
  510. int    vol_debug_level = 0;
  511. #endif    /* VXVM_DEBUG */
  512.  
  513. /*
  514.  * vol_call_debugger() - function to call to trap to a debugger
  515.  */
  516. #if defined(VXVM_DEBUG)
  517. char *vol_debugger_msg;
  518. VOID *vol_debugger_arg;
  519.  
  520. void
  521. vol_call_debugger(arg, msg)
  522.     VOID *arg;
  523.     char *msg;
  524. {
  525.     vol_debugger_msg = msg;
  526.     vol_debugger_arg = arg;
  527.  
  528. #ifdef SVR4
  529.         call_demon(msg);
  530. #else   /* not SVR4 */
  531. #ifdef SOLARIS
  532.     debug_enter(msg);
  533. #else   /* not SOLARIS */
  534. #ifdef UW_2_1
  535.         if (msg) {
  536.                 cmn_err(CE_CONT,"%s\n", msg);
  537.         }
  538.         call_demon();
  539. #else /* !UW_2_1 */
  540.         VOL_WARN_MSG2("BREAKPOINT: %s, arg=%x", msg, (unsigned)arg);
  541. #endif /* UW_2_1 */
  542. #endif  /* SOLARIS */
  543. #endif  /* SVR4 */
  544. }
  545. #endif    /* VXVM_DEBUG */
  546.  
  547. #ifdef SOLARIS
  548. /*
  549.  * Store miscellaneous tunables from the /etc/system-settable
  550.  * simple variables into the volinfo structure. Plus 3 or 4 variables
  551.  * in volinfo which can't be staticly configured.
  552.  */
  553. int 
  554. volinfo_init()
  555. {
  556.     /*
  557.      * The block and character device numbers must be
  558.      * filled in at load time on Solaris systems.
  559.      */
  560.     volinfo.volcmajor = ddi_name_to_major(VOL_DRIVER);
  561.     volinfo.volbmajor = ddi_name_to_major(VOL_DRIVER);
  562.     volinfo.vol_is_root = vol_rootdev_is_volume;
  563.     volinfo.prom_version  = obp_romvec_version;
  564.  
  565.     /*
  566.      * Store miscellaneous tunables from the /etc/system-settable
  567.      * simple variables into the volinfo structure.
  568.      */
  569.     volinfo.maxvol = vol_maxvol;
  570.     volinfo.sdnum = vol_subdisk_num;
  571.     volinfo.max_ioctl = vol_maxioctl;
  572.     volinfo.max_specio = vol_maxspecialio;
  573.     volinfo.max_io = vol_maxio;
  574.     volinfo.vol_maxkiocount = vol_maxkiocount;
  575.     volinfo.dflt_iodelay = vol_default_iodelay;
  576.     volinfo.voldrl_min_regionsz = voldrl_min_regionsz;
  577.     volinfo.voldrl_max_drtregs = voldrl_max_drtregs;
  578.     volinfo.max_parallelio = vol_maxparallelio;
  579.     volinfo.mvrmaxround = vol_mvr_maxround;
  580.     volinfo.vol_maxstablebufsize = vol_maxstablebufsize;
  581.     volinfo.voliot_iobuf_limit = voliot_iobuf_limit;
  582.     volinfo.voliot_iobuf_max = voliot_iobuf_max;
  583.     volinfo.voliot_iobuf_default = voliot_iobuf_default;
  584.     volinfo.voliot_errbuf_default = voliot_errbuf_default;
  585.     volinfo.voliot_max_open = voliot_max_open;
  586.     volinfo.vol_checkpt_default = vol_checkpt_default;
  587.     volinfo.volraid_rsrtransmax = volraid_rsrtransmax;
  588. }
  589. #endif /* SOLARIS */
  590.