source: mainline/uspace/srv/bd/hr/var.h@ 7e8c0e7

Last change on this file since 7e8c0e7 was 8b51009, checked in by Miroslav Cimerman <mc@…>, 4 months ago

hr: auto assembly, refactor

Added automatic assembly (with hrctl -A). All disks or their partitions
are scanned for HelenRAID metadata and assembly is attempted.

Main volume list is now locked with RW lock. The volume list
manipulation functions are moved into util.c.

hr_{create,destroy}_vol_struct() are implemented for better reusability
and modularity.

Volume destroy/stop (hrctl -D) now returns EBUSY if someone has still
the volume open()-ed.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 * Copyright (c) 2025 Miroslav Cimerman
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup hr
30 * @{
31 */
32/**
33 * @file
34 */
35
36#ifndef _HR_VAR_H
37#define _HR_VAR_H
38
39#include <adt/list.h>
40#include <bd_srv.h>
41#include <errno.h>
42#include <fibril_synch.h>
43#include <hr.h>
44#include <stdatomic.h>
45
46#include "fge.h"
47#include "superblock.h"
48
49#define NAME "hr"
50#define HR_STRIP_SIZE DATA_XFER_LIMIT
51
52struct hr_volume;
53typedef struct hr_volume hr_volume_t;
54typedef struct hr_metadata hr_metadata_t;
55
56typedef struct hr_ops {
57 errno_t (*create)(hr_volume_t *);
58 errno_t (*init)(hr_volume_t *);
59 void (*status_event)(hr_volume_t *);
60 errno_t (*add_hotspare)(hr_volume_t *, service_id_t);
61} hr_ops_t;
62
63typedef struct hr_volume {
64 link_t lvolumes; /* link to all volumes list */
65 hr_ops_t hr_ops; /* level init and create fcns */
66 bd_srvs_t hr_bds; /* block interface to the vol */
67 service_id_t svc_id; /* service id */
68
69 fibril_mutex_t lock; /* XXX: gone after para */
70 list_t range_lock_list; /* list of range locks */
71 fibril_mutex_t range_lock_list_lock; /* range locks list lock */
72 hr_fpool_t *fge; /* fibril pool */
73
74 uint32_t metadata_version; /* XXX: yet unused */
75
76 hr_metadata_t *in_mem_md; /* TODO: implement */
77
78 /* invariants */
79 size_t extent_no; /* number of extents */
80 size_t bsize; /* block size */
81 uint64_t nblocks; /* no. of all usable blocks */
82 uint64_t truncated_blkno; /* blkno per extent */
83 uint64_t data_blkno; /* no. of user usable blocks */
84 uint64_t data_offset; /* user data offset in blocks */
85 uint32_t strip_size; /* strip size */
86 hr_level_t level; /* volume level */
87 uint8_t layout; /* RAID Level Qualifier */
88 char devname[HR_DEVNAME_LEN];
89
90 hr_extent_t extents[HR_MAX_EXTENTS];
91 fibril_rwlock_t extents_lock; /* extent service id lock */
92
93 size_t hotspare_no; /* no. of available hotspares */
94 hr_extent_t hotspares[HR_MAX_HOTSPARES];
95 fibril_mutex_t hotspare_lock; /* lock protecting hotspares */
96
97 fibril_rwlock_t states_lock; /* states lock */
98
99 _Atomic bool state_dirty; /* dirty state */
100
101 /* XXX: atomic_uint_least64_t? */
102 _Atomic uint64_t rebuild_blk; /* rebuild position */
103 _Atomic int open_cnt; /* open/close() counter */
104 uint64_t counter; /* TODO: metadata syncing */
105 hr_vol_status_t status; /* volume status */
106} hr_volume_t;
107
108typedef enum {
109 HR_BD_SYNC,
110 HR_BD_READ,
111 HR_BD_WRITE
112} hr_bd_op_type_t;
113
114typedef struct hr_range_lock {
115 link_t link;
116 fibril_mutex_t lock;
117 hr_volume_t *vol; /* back-pointer to volume */
118 uint64_t off; /* start of the range */
119 uint64_t len; /* length of the range */
120
121 size_t pending; /* prot. by vol->range_lock_list_lock */
122 bool ignore; /* prot. by vol->range_lock_list_lock */
123} hr_range_lock_t;
124
125extern errno_t hr_init_devs(hr_volume_t *);
126extern void hr_fini_devs(hr_volume_t *);
127
128extern errno_t hr_raid0_create(hr_volume_t *);
129extern errno_t hr_raid1_create(hr_volume_t *);
130extern errno_t hr_raid5_create(hr_volume_t *);
131
132extern errno_t hr_raid0_init(hr_volume_t *);
133extern errno_t hr_raid1_init(hr_volume_t *);
134extern errno_t hr_raid5_init(hr_volume_t *);
135
136extern void hr_raid0_status_event(hr_volume_t *);
137extern void hr_raid1_status_event(hr_volume_t *);
138extern void hr_raid5_status_event(hr_volume_t *);
139
140extern errno_t hr_raid1_add_hotspare(hr_volume_t *, service_id_t);
141extern errno_t hr_raid5_add_hotspare(hr_volume_t *, service_id_t);
142
143#endif
144
145/** @}
146 */
Note: See TracBrowser for help on using the repository browser.