Changeset de81104 in mainline
- Timestamp:
- 2025-03-23T16:35:34Z (3 months ago)
- Children:
- 2958e70
- Parents:
- e3e53cc
- git-author:
- Miroslav Cimerman <mc@…> (2025-03-23 16:14:36)
- git-committer:
- Miroslav Cimerman <mc@…> (2025-03-23 16:35:34)
- Location:
- uspace
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/device/include/hr.h
re3e53cc rde81104 1 1 /* 2 * Copyright (c) 202 4Miroslav Cimerman2 * Copyright (c) 2025 Miroslav Cimerman 3 3 * All rights reserved. 4 4 * … … 90 90 91 91 typedef struct hr_config { 92 char devname[HR_DEVNAME_LEN];93 service_id_t devs[HR_MAX_EXTENTS];94 size_t dev_no;95 hr_level_t level;92 char devname[HR_DEVNAME_LEN]; 93 service_id_t devs[HR_MAX_EXTENTS]; 94 size_t dev_no; 95 hr_level_t level; 96 96 } hr_config_t; 97 97 98 98 typedef struct hr_extent { 99 service_id_t svc_id;100 hr_ext_status_t status;99 service_id_t svc_id; 100 hr_ext_status_t status; 101 101 } hr_extent_t; 102 102 103 103 typedef struct hr_vol_info { 104 hr_extent_t extents[HR_MAX_EXTENTS];105 hr_extent_t hotspares[HR_MAX_HOTSPARES];106 size_t extent_no;107 size_t hotspare_no;108 service_id_t svc_id;109 hr_level_t level;110 uint64_t nblocks;111 uint32_t strip_size;112 size_t bsize;113 hr_vol_status_t status;114 uint8_t layout;104 hr_extent_t extents[HR_MAX_EXTENTS]; 105 hr_extent_t hotspares[HR_MAX_HOTSPARES]; 106 size_t extent_no; 107 size_t hotspare_no; 108 service_id_t svc_id; 109 hr_level_t level; 110 uint64_t nblocks; 111 uint32_t strip_size; 112 size_t bsize; 113 hr_vol_status_t status; 114 uint8_t layout; 115 115 } hr_vol_info_t; 116 116 117 extern errno_t hr_sess_init(hr_t **); 118 extern void hr_sess_destroy(hr_t *); 119 120 extern errno_t hr_create(hr_t *, hr_config_t *, bool); 121 extern errno_t hr_stop(const char *, long); 122 extern errno_t hr_add_hotspare(service_id_t, service_id_t); 123 extern errno_t hr_print_status(void); 124 125 extern const char *hr_get_vol_status_msg(hr_vol_status_t); 126 extern const char *hr_get_ext_status_msg(hr_ext_status_t); 127 extern const char *hr_get_layout_str(hr_level_t, uint8_t); 117 extern errno_t hr_sess_init(hr_t **); 118 extern void hr_sess_destroy(hr_t *); 119 extern errno_t hr_create(hr_t *, hr_config_t *, bool); 120 extern errno_t hr_stop(const char *, long); 121 extern errno_t hr_add_hotspare(service_id_t, service_id_t); 122 extern errno_t hr_print_status(void); 123 extern const char *hr_get_vol_status_msg(hr_vol_status_t); 124 extern const char *hr_get_ext_status_msg(hr_ext_status_t); 125 extern const char *hr_get_layout_str(hr_level_t, uint8_t); 128 126 129 127 #endif -
uspace/srv/bd/hr/var.h
re3e53cc rde81104 45 45 #include "fge.h" 46 46 47 #define NAME "hr" 48 49 #define HR_STRIP_SIZE DATA_XFER_LIMIT 47 #define NAME "hr" 48 #define HR_STRIP_SIZE DATA_XFER_LIMIT 50 49 51 50 struct hr_volume; … … 53 52 54 53 typedef struct hr_ops { 55 errno_t 56 errno_t 57 void (*status_event)(hr_volume_t *);58 errno_t (*add_hotspare)(hr_volume_t *, service_id_t);54 errno_t (*create)(hr_volume_t *); 55 errno_t (*init)(hr_volume_t *); 56 void (*status_event)(hr_volume_t *); 57 errno_t (*add_hotspare)(hr_volume_t *, service_id_t); 59 58 } hr_ops_t; 60 59 61 60 typedef struct hr_volume { 62 hr_ops_t hr_ops; 63 bd_srvs_t hr_bds; 61 link_t lvolumes; /* link to all volumes list */ 62 hr_ops_t hr_ops; /* level init and create fcns */ 63 bd_srvs_t hr_bds; /* block interface to the vol */ 64 service_id_t svc_id; /* service id */ 64 65 65 link_t lvolumes; /* protected by static hr_volumes_lock in hr.c */ 66 fibril_mutex_t lock; /* XXX: gone after para */ 67 list_t range_lock_list; /* list of range locks */ 68 fibril_mutex_t range_lock_list_lock; /* range locks list lock */ 69 hr_fpool_t *fge; /* fibril pool */ 66 70 67 /* 68 * XXX: will be gone after all paralelization, but still used 69 * in yet-unparallelized levels 71 /* invariants */ 72 size_t extent_no; /* number of extents */ 73 size_t bsize; /* block size */ 74 uint64_t nblocks; /* no. of all usable blocks */ 75 uint64_t data_blkno; /* no. of user usable blocks */ 76 uint64_t data_offset; /* user data offset in blocks */ 77 uint32_t strip_size; /* strip size */ 78 hr_level_t level; /* volume level */ 79 uint8_t layout; /* RAID Level Qualifier */ 80 char devname[HR_DEVNAME_LEN]; 81 82 hr_extent_t extents[HR_MAX_EXTENTS]; 83 fibril_rwlock_t extents_lock; /* extent service id lock */ 84 85 size_t hotspare_no; /* no. of available hotspares */ 86 hr_extent_t hotspares[HR_MAX_HOTSPARES + HR_MAX_EXTENTS]; 87 fibril_mutex_t hotspare_lock; /* lock protecting hotspares */ 88 89 fibril_rwlock_t states_lock; /* states lock */ 90 91 _Atomic bool state_dirty; /* dirty state */ 92 93 /* XXX: unportable for 32-bit? 94 * 95 * Add macros for locking or atomic increment depending 96 * on the platform? 70 97 */ 71 fibril_mutex_t lock; 72 73 list_t range_lock_list; 74 fibril_mutex_t range_lock_list_lock; 75 76 hr_fpool_t *fge; 77 78 /* after assembly, these are invariant */ 79 size_t extent_no; 80 size_t bsize; 81 uint64_t nblocks; 82 uint64_t data_blkno; 83 uint64_t data_offset; /* in blocks */ 84 uint32_t strip_size; 85 hr_level_t level; 86 uint8_t layout; /* RAID Level Qualifier */ 87 service_id_t svc_id; 88 char devname[HR_DEVNAME_LEN]; 89 90 size_t hotspare_no; 91 hr_extent_t hotspares[HR_MAX_HOTSPARES + HR_MAX_EXTENTS]; 92 93 /* protects hotspares (hotspares.{svc_id,status}, hotspare_no) */ 94 fibril_mutex_t hotspare_lock; 95 96 hr_extent_t extents[HR_MAX_EXTENTS]; 97 /* protects extents ordering (extents.svc_id) */ 98 fibril_rwlock_t extents_lock; 99 /* protects states (extents.status, hr_volume_t.status) */ 100 fibril_rwlock_t states_lock; 101 102 _Atomic bool state_dirty; 103 _Atomic uint64_t rebuild_blk; 104 uint64_t counter; /* metadata syncing */ 105 hr_vol_status_t status; 98 _Atomic uint64_t rebuild_blk; /* rebuild position */ 99 uint64_t counter; /* TODO: metadata syncing */ 100 hr_vol_status_t status; /* volume status */ 106 101 } hr_volume_t; 107 102 … … 113 108 114 109 typedef struct hr_range_lock { 115 fibril_mutex_t lock; 116 link_t link; 117 hr_volume_t *vol; 118 uint64_t off; 119 uint64_t len; 120 size_t pending; /* protected by vol->range_lock_list_lock */ 121 bool ignore; /* protected by vol->range_lock_list_lock */ 110 link_t link; 111 fibril_mutex_t lock; 112 hr_volume_t *vol; /* back-pointer to volume */ 113 uint64_t off; /* start of the range */ 114 uint64_t len; /* length of the range */ 115 116 size_t pending; /* prot. by vol->range_lock_list_lock */ 117 bool ignore; /* prot. by vol->range_lock_list_lock */ 122 118 } hr_range_lock_t; 123 119 124 extern errno_t 125 extern void 120 extern errno_t hr_init_devs(hr_volume_t *); 121 extern void hr_fini_devs(hr_volume_t *); 126 122 127 extern errno_t 128 extern errno_t hr_raid1_create(hr_volume_t *);129 extern errno_t hr_raid5_create(hr_volume_t *);123 extern errno_t hr_raid0_create(hr_volume_t *); 124 extern errno_t hr_raid1_create(hr_volume_t *); 125 extern errno_t hr_raid5_create(hr_volume_t *); 130 126 131 extern errno_t 132 extern errno_t hr_raid1_init(hr_volume_t *);133 extern errno_t hr_raid5_init(hr_volume_t *);127 extern errno_t hr_raid0_init(hr_volume_t *); 128 extern errno_t hr_raid1_init(hr_volume_t *); 129 extern errno_t hr_raid5_init(hr_volume_t *); 134 130 135 extern void 136 extern void 137 extern void 131 extern void hr_raid0_status_event(hr_volume_t *); 132 extern void hr_raid1_status_event(hr_volume_t *); 133 extern void hr_raid5_status_event(hr_volume_t *); 138 134 139 extern errno_t 140 extern errno_t 135 extern errno_t hr_raid1_add_hotspare(hr_volume_t *, service_id_t); 136 extern errno_t hr_raid5_add_hotspare(hr_volume_t *, service_id_t); 141 137 142 138 #endif
Note:
See TracChangeset
for help on using the changeset viewer.