Changeset 22fb7ab in mainline for uspace/srv/volsrv
- Timestamp:
- 2015-06-26T16:15:31Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 28ed0d95
- Parents:
- 1356f85a
- Location:
- uspace/srv/volsrv
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/volsrv/disk.c
r1356f85a r22fb7ab 42 42 #include <stdlib.h> 43 43 #include <str.h> 44 #include <vbd.h> 44 45 45 46 #include "disk.h" … … 48 49 static int vol_disk_add(service_id_t); 49 50 50 static LIST_INITIALIZE(vol_disks); 51 static LIST_INITIALIZE(vol_disks); /* of vol_disk_t */ 51 52 static FIBRIL_MUTEX_INITIALIZE(vol_disks_lock); 53 static vbd_t *vbd; 52 54 53 55 /** Check for new disk devices */ … … 113 115 114 116 link_initialize(&disk->ldisks); 117 disk->dcnt = dc_empty; 115 118 116 119 return disk; … … 129 132 { 130 133 vol_disk_t *disk; 134 vbd_disk_info_t dinfo; 131 135 int rc; 132 136 … … 147 151 148 152 log_msg(LOG_DEFAULT, LVL_NOTE, "Probe disk %s", disk->svc_name); 149 /* rc = inetcfg_link_add(sid); 150 if (rc != EOK) { 151 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed configuring link " 152 "'%s'.\n", nlink->svc_name); 153 goto error; 154 } 155 */ 153 154 rc = vbd_disk_add(vbd, sid); 155 if (rc == EOK) { 156 log_msg(LOG_DEFAULT, LVL_NOTE, "Disk %s accepted by VBD.", 157 disk->svc_name); 158 159 rc = vbd_disk_info(vbd, sid, &dinfo); 160 if (rc != EOK) { 161 log_msg(LOG_DEFAULT, LVL_NOTE, "Cannot get disk label " 162 "information."); 163 rc = EIO; 164 goto error; 165 } 166 167 disk->dcnt = dc_label; 168 disk->ltype = dinfo.ltype; 169 } else { 170 log_msg(LOG_DEFAULT, LVL_NOTE, "Disk %s not accepted by VBD.", 171 disk->svc_name); 172 disk->dcnt = dc_unknown; 173 } 174 156 175 list_append(&disk->ldisks, &vol_disks); 157 176 … … 168 187 } 169 188 189 int vol_disk_init(void) 190 { 191 int rc; 192 193 rc = vbd_create(&vbd); 194 if (rc != EOK) { 195 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing VBD."); 196 return EIO; 197 } 198 199 return EOK; 200 } 201 170 202 int vol_disk_discovery_start(void) 171 203 { … … 182 214 } 183 215 216 /** Get list of disks as array of service IDs. */ 217 int vol_disk_get_ids(service_id_t *id_buf, size_t buf_size, size_t *act_size) 218 { 219 size_t act_cnt; 220 size_t buf_cnt; 221 222 fibril_mutex_lock(&vol_disks_lock); 223 224 buf_cnt = buf_size / sizeof(service_id_t); 225 226 act_cnt = list_count(&vol_disks); 227 *act_size = act_cnt * sizeof(service_id_t); 228 229 if (buf_size % sizeof(service_id_t) != 0) { 230 fibril_mutex_unlock(&vol_disks_lock); 231 return EINVAL; 232 } 233 234 size_t pos = 0; 235 list_foreach(vol_disks, ldisks, vol_disk_t, disk) { 236 if (pos < buf_cnt) 237 id_buf[pos] = disk->svc_id; 238 pos++; 239 } 240 241 fibril_mutex_unlock(&vol_disks_lock); 242 return EOK; 243 } 244 245 int vol_disk_find_by_id(service_id_t sid, vol_disk_t **rdisk) 246 { 247 list_foreach(vol_disks, ldisks, vol_disk_t, disk) { 248 if (disk->svc_id == sid) { 249 *rdisk = disk; 250 /* XXX Add reference */ 251 return EOK; 252 } 253 } 254 255 return ENOENT; 256 } 257 184 258 /** @} 185 259 */ -
uspace/srv/volsrv/disk.h
r1356f85a r22fb7ab 39 39 40 40 #include <sys/types.h> 41 #include "types/disk.h" 41 42 43 extern int vol_disk_init(void); 42 44 extern int vol_disk_discovery_start(void); 45 extern int vol_disk_get_ids(service_id_t *, size_t, size_t *); 46 extern int vol_disk_find_by_id(service_id_t, vol_disk_t **); 43 47 44 48 #endif -
uspace/srv/volsrv/types/disk.h
r1356f85a r22fb7ab 38 38 #define TYPES_DISK_H_ 39 39 40 #include <types/label.h> 41 40 42 /** Disk */ 41 43 typedef struct { … … 46 48 /** Service name */ 47 49 char *svc_name; 50 /** Disk contents */ 51 label_disk_cnt_t dcnt; 52 /** Label type */ 53 label_type_t ltype; 48 54 } vol_disk_t; 49 55 -
uspace/srv/volsrv/volsrv.c
r1356f85a r22fb7ab 38 38 #include <io/log.h> 39 39 #include <ipc/services.h> 40 #include <ipc/vol.h> 40 41 #include <loc.h> 41 42 #include <stdio.h> … … 54 55 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_init()"); 55 56 57 rc = vol_disk_init(); 58 if (rc != EOK) 59 return rc; 60 56 61 rc = vol_disk_discovery_start(); 57 62 if (rc != EOK) … … 76 81 } 77 82 83 static void vol_get_disks_srv(ipc_callid_t iid, ipc_call_t *icall) 84 { 85 ipc_callid_t callid; 86 size_t size; 87 size_t act_size; 88 int rc; 89 90 if (!async_data_read_receive(&callid, &size)) { 91 async_answer_0(callid, EREFUSED); 92 async_answer_0(iid, EREFUSED); 93 return; 94 } 95 96 service_id_t *id_buf = (service_id_t *) malloc(size); 97 if (id_buf == NULL) { 98 async_answer_0(callid, ENOMEM); 99 async_answer_0(iid, ENOMEM); 100 return; 101 } 102 103 rc = vol_disk_get_ids(id_buf, size, &act_size); 104 if (rc != EOK) { 105 async_answer_0(callid, rc); 106 async_answer_0(iid, rc); 107 return; 108 } 109 110 sysarg_t retval = async_data_read_finalize(callid, id_buf, size); 111 free(id_buf); 112 113 async_answer_1(iid, retval, act_size); 114 } 115 116 static void vol_disk_info_srv(ipc_callid_t iid, ipc_call_t *icall) 117 { 118 service_id_t sid; 119 vol_disk_t *disk; 120 int rc; 121 122 sid = IPC_GET_ARG1(*icall); 123 rc = vol_disk_find_by_id(sid, &disk); 124 if (rc != EOK) { 125 async_answer_0(iid, ENOENT); 126 return; 127 } 128 129 async_answer_2(iid, rc, disk->dcnt, disk->ltype); 130 } 131 132 static void vol_label_create_srv(ipc_callid_t iid, ipc_call_t *icall) 133 { 134 service_id_t sid; 135 vol_disk_t *disk; 136 label_type_t ltype; 137 int rc; 138 139 sid = IPC_GET_ARG1(*icall); 140 ltype = IPC_GET_ARG2(*icall); 141 142 rc = vol_disk_find_by_id(sid, &disk); 143 if (rc != EOK) { 144 async_answer_0(iid, ENOENT); 145 return; 146 } 147 148 disk->dcnt = dc_label; 149 disk->ltype = ltype; 150 151 async_answer_0(iid, EOK); 152 } 153 154 static void vol_disk_empty_srv(ipc_callid_t iid, ipc_call_t *icall) 155 { 156 service_id_t sid; 157 vol_disk_t *disk; 158 int rc; 159 160 sid = IPC_GET_ARG1(*icall); 161 162 rc = vol_disk_find_by_id(sid, &disk); 163 if (rc != EOK) { 164 async_answer_0(iid, ENOENT); 165 return; 166 } 167 168 disk->dcnt = dc_empty; 169 170 async_answer_0(iid, EOK); 171 } 78 172 79 173 static void vol_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) … … 96 190 97 191 switch (method) { 192 case VOL_GET_DISKS: 193 vol_get_disks_srv(callid, &call); 194 break; 195 case VOL_DISK_INFO: 196 vol_disk_info_srv(callid, &call); 197 break; 198 case VOL_LABEL_CREATE: 199 vol_label_create_srv(callid, &call); 200 break; 201 case VOL_DISK_EMPTY: 202 vol_disk_empty_srv(callid, &call); 203 break; 98 204 default: 99 205 async_answer_0(callid, EINVAL);
Note:
See TracChangeset
for help on using the changeset viewer.