Changeset 4285f384 in mainline
- Timestamp:
- 2025-02-25T20:25:43Z (12 hours ago)
- Branches:
- master
- Parents:
- d231a54
- Location:
- uspace
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sysinst/rdimg.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 18Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 191 191 192 192 printf("rd_img_close: eject RAM disk volume\n"); 193 rc = vol_part_eject(vol, rd_svcid );193 rc = vol_part_eject(vol, rd_svcid, vef_none); 194 194 if (rc != EOK) { 195 195 printf("Error ejecting RAM disk volume.\n"); -
uspace/app/sysinst/sysinst.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 475 475 } 476 476 477 rc = vol_part_eject(vol, part_id );477 rc = vol_part_eject(vol, part_id, vef_physical); 478 478 if (rc != EOK) { 479 479 printf("Error ejecting volume.\n"); -
uspace/app/vol/vol.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 17Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #include <io/table.h> 37 37 #include <loc.h> 38 #include <stdbool.h> 38 39 #include <stdio.h> 39 40 #include <stdlib.h> … … 107 108 } 108 109 109 static errno_t vol_cmd_eject(const char *volspec )110 static errno_t vol_cmd_eject(const char *volspec, bool physical) 110 111 { 111 112 vol_t *vol = NULL; … … 125 126 } 126 127 127 rc = vol_part_eject(vol, part_id); 128 rc = vol_part_eject(vol, part_id, physical ? vef_physical : 129 vef_none); 128 130 if (rc != EOK) { 129 131 printf("Error ejecting volume.\n"); … … 323 325 { 324 326 printf("Syntax:\n"); 325 printf(" %s List present volumes\n", NAME); 326 printf(" %s -c List volume configuration entries\n", NAME); 327 printf(" %s -h Print help\n", NAME); 328 printf(" %s eject <mp> Eject volume mounted in a directory\n", NAME); 329 printf(" %s insert <svc> Insert volume based on service identifier\n", NAME); 330 printf(" %s insert -p <mp> Insert volume based on filesystem path\n", NAME); 327 printf(" %s List present volumes\n", NAME); 328 printf(" %s -c List volume configuration entries\n", NAME); 329 printf(" %s -h Print help\n", NAME); 330 printf(" %s eject [-s] <mp> Eject volume mounted in a directory\n", NAME); 331 printf(" -s to eject physically\n"); 332 printf(" %s insert <svc> Insert volume based on service identifier\n", NAME); 333 printf(" %s insert -p <mp> Insert volume based on filesystem path\n", NAME); 331 334 } 332 335 … … 336 339 char *volspec; 337 340 vol_cmd_t vcmd; 341 bool physical = false; 338 342 int i; 339 343 errno_t rc = EINVAL; … … 351 355 } else if (str_cmp(cmd, "eject") == 0) { 352 356 vcmd = vcmd_eject; 357 if (str_cmp(argv[i], "-s") == 0) { 358 physical = true; 359 ++i; 360 } 361 353 362 if (argc <= i) { 354 363 printf("Parameter missing.\n"); … … 382 391 switch (vcmd) { 383 392 case vcmd_eject: 384 rc = vol_cmd_eject(volspec );393 rc = vol_cmd_eject(volspec, physical); 385 394 break; 386 395 case vcmd_insert: -
uspace/lib/ata/src/ata.c
rd231a54 r4285f384 96 96 static errno_t ata_bd_get_block_size(bd_srv_t *, size_t *); 97 97 static errno_t ata_bd_get_num_blocks(bd_srv_t *, aoff64_t *); 98 static errno_t ata_bd_eject(bd_srv_t *); 98 99 static errno_t ata_bd_sync_cache(bd_srv_t *, aoff64_t, size_t); 99 100 … … 105 106 static errno_t ata_identify_dev(ata_device_t *, void *); 106 107 static errno_t ata_identify_pkt_dev(ata_device_t *, void *); 107 static errno_t ata_cmd_packet(ata_device_t *, const void *, size_t, void *, 108 static errno_t ata_cmd_packet_nondata(ata_device_t *, const void *, size_t); 109 static errno_t ata_cmd_packet_din(ata_device_t *, const void *, size_t, void *, 108 110 size_t, size_t *); 109 111 static errno_t ata_pcmd_inquiry(ata_device_t *, void *, size_t, size_t *); … … 111 113 static errno_t ata_pcmd_read_capacity(ata_device_t *, uint64_t *, size_t *); 112 114 static errno_t ata_pcmd_read_toc(ata_device_t *, uint8_t, void *, size_t); 115 static errno_t ata_pcmd_start_stop_unit(ata_device_t *, uint8_t); 113 116 static void disk_print_summary(ata_device_t *); 114 117 static size_t ata_disk_maxnb(ata_device_t *); … … 129 132 .get_block_size = ata_bd_get_block_size, 130 133 .get_num_blocks = ata_bd_get_num_blocks, 131 .sync_cache = ata_bd_sync_cache 134 .sync_cache = ata_bd_sync_cache, 135 .eject = ata_bd_eject 132 136 }; 133 137 … … 758 762 } 759 763 764 /** Eject medium. */ 765 static errno_t ata_bd_eject(bd_srv_t *bd) 766 { 767 ata_device_t *device = bd_srv_device(bd); 768 769 ata_msg_debug(device->chan, "ata_bd_eject()"); 770 return ata_pcmd_start_stop_unit(device, ssf_pc_no_change | 771 ssf_loej); 772 } 773 760 774 /** PIO data-in command protocol. */ 761 775 static errno_t ata_pio_data_in(ata_device_t *device, void *obuf, size_t obuf_size, … … 1088 1102 } 1089 1103 1090 /** Issue packet command (i. e. write a command packet to the device). 1091 * 1092 * Only data-in commands are supported (e.g. inquiry, read). 1104 /** Issue packet command (i. e. write a command packet to the device) 1105 * with no data transfer. 1093 1106 * 1094 1107 * @param device Device 1108 * @param cpkt Command packet 1109 * @param cpkt_size Command packet size in bytes 1110 * 1111 * @return EOK on success, EIO on error. 1112 */ 1113 static errno_t ata_cmd_packet_nondata(ata_device_t *device, const void *cpkt, 1114 size_t cpkt_size) 1115 { 1116 ata_channel_t *chan = device->chan; 1117 uint8_t status; 1118 uint8_t drv_head; 1119 errno_t rc; 1120 1121 ata_msg_debug(chan, "ata_cmd_packet_nondata()"); 1122 1123 fibril_mutex_lock(&chan->lock); 1124 1125 /* New value for Drive/Head register */ 1126 drv_head = 1127 ((disk_dev_idx(device) != 0) ? DHR_DRV : 0); 1128 1129 if (wait_status(chan, 0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK) { 1130 fibril_mutex_unlock(&chan->lock); 1131 return EIO; 1132 } 1133 1134 ata_write_cmd_8(chan, REG_DRIVE_HEAD, drv_head); 1135 1136 if (wait_status(chan, 0, ~(SR_BSY | SR_DRQ), NULL, TIMEOUT_BSY) != EOK) { 1137 fibril_mutex_unlock(&chan->lock); 1138 return EIO; 1139 } 1140 1141 ata_write_cmd_8(chan, REG_COMMAND, CMD_PACKET); 1142 1143 if (wait_status(chan, SR_DRQ, ~SR_BSY, &status, TIMEOUT_BSY) != EOK) { 1144 if (chan->params.use_dma) 1145 ata_dma_chan_teardown(device); 1146 fibril_mutex_unlock(&chan->lock); 1147 return EIO; 1148 } 1149 1150 /* Write command packet. */ 1151 ata_write_data_16(chan, ((uint16_t *) cpkt), (cpkt_size + 1) / 2); 1152 1153 rc = ata_pio_nondata(device); 1154 1155 fibril_mutex_unlock(&chan->lock); 1156 1157 return rc; 1158 } 1159 1160 /** Issue packet command (i. e. write a command packet to the device) 1161 * performing data-in transfer. 1162 * 1163 * @param device Device 1164 * @param cpkt Command packet 1165 * @param cpkt_size Command packet size in bytes 1095 1166 * @param obuf Buffer for storing data read from device 1096 1167 * @param obuf_size Size of obuf in bytes … … 1099 1170 * @return EOK on success, EIO on error. 1100 1171 */ 1101 static errno_t ata_cmd_packet (ata_device_t *device, const void *cpkt, size_t cpkt_size,1102 void *obuf, size_t obuf_size, size_t *rcvd_size)1172 static errno_t ata_cmd_packet_din(ata_device_t *device, const void *cpkt, 1173 size_t cpkt_size, void *obuf, size_t obuf_size, size_t *rcvd_size) 1103 1174 { 1104 1175 ata_channel_t *chan = device->chan; … … 1195 1266 cp->alloc_len = host2uint16_t_be(min(obuf_size, 0xff)); 1196 1267 1197 rc = ata_cmd_packet(device, cpb, sizeof(cpb), obuf, obuf_size, rcvd_size); 1268 rc = ata_cmd_packet_din(device, cpb, sizeof(cpb), obuf, obuf_size, 1269 rcvd_size); 1198 1270 if (rc != EOK) 1199 1271 return rc; … … 1221 1293 cdb.op_code = SCSI_CMD_READ_CAPACITY_10; 1222 1294 1223 rc = ata_cmd_packet(device, &cdb, sizeof(cdb), &data, sizeof(data), &rsize); 1295 rc = ata_cmd_packet_din(device, &cdb, sizeof(cdb), &data, sizeof(data), 1296 &rsize); 1224 1297 if (rc != EOK) 1225 1298 return rc; … … 1262 1335 cp.xfer_len = host2uint32_t_be(cnt); 1263 1336 1264 rc = ata_cmd_packet (device, &cp, sizeof(cp), obuf, obuf_size, NULL);1337 rc = ata_cmd_packet_din(device, &cp, sizeof(cp), obuf, obuf_size, NULL); 1265 1338 if (rc != EOK) 1266 1339 return rc; … … 1302 1375 cp->control = 0x40; /* 0x01 = multi-session mode (shifted to MSB) */ 1303 1376 1304 rc = ata_cmd_packet(device, cpb, sizeof(cpb), obuf, obuf_size, NULL); 1377 rc = ata_cmd_packet_din(device, cpb, sizeof(cpb), obuf, obuf_size, 1378 NULL); 1305 1379 if (rc != EOK) 1306 1380 return rc; 1381 1382 return EOK; 1383 } 1384 1385 /** Issue Start Stop Unit command. 1386 * 1387 * @param device Device 1388 * @param flags Flags field of Start Stop Unit command (ssf_*) 1389 * @return EOK on success, EIO on error. 1390 */ 1391 static errno_t ata_pcmd_start_stop_unit(ata_device_t *device, uint8_t flags) 1392 { 1393 uint8_t cpb[12]; 1394 scsi_cdb_start_stop_unit_t *cp = (scsi_cdb_start_stop_unit_t *)cpb; 1395 errno_t rc; 1396 1397 ata_msg_debug(device->chan, "ata_pcmd_start_stop_unit(device, 0x%x)", 1398 flags); 1399 1400 memset(cpb, 0, sizeof(cpb)); 1401 1402 /* 1403 * For SFF 8020 compliance the command must be padded to 12 bytes. 1404 */ 1405 cp->op_code = SCSI_CMD_START_STOP_UNIT; 1406 cp->immed = 0; 1407 cp->flags = flags; 1408 cp->control = 0; 1409 1410 rc = ata_cmd_packet_nondata(device, cpb, sizeof(cpb)); 1411 if (rc != EOK) 1412 return rc; 1413 1414 ata_msg_debug(device->chan, "ata_pcmd_start_stop_unit(): " 1415 "ata_cmd_packet_nondata -> %d", rc); 1307 1416 1308 1417 return EOK; -
uspace/lib/device/include/bd.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 12Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 51 51 extern errno_t bd_get_block_size(bd_t *, size_t *); 52 52 extern errno_t bd_get_num_blocks(bd_t *, aoff64_t *); 53 extern errno_t bd_eject(bd_t *); 53 54 54 55 #endif -
uspace/lib/device/include/bd_srv.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 12Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 66 66 errno_t (*get_block_size)(bd_srv_t *, size_t *); 67 67 errno_t (*get_num_blocks)(bd_srv_t *, aoff64_t *); 68 errno_t (*eject)(bd_srv_t *); 68 69 }; 69 70 -
uspace/lib/device/include/ipc/bd.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 09Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 44 44 BD_SYNC_CACHE, 45 45 BD_WRITE_BLOCKS, 46 BD_READ_TOC 46 BD_READ_TOC, 47 BD_EJECT 47 48 } bd_request_t; 48 49 -
uspace/lib/device/include/ipc/vol.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 15 Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 54 54 } vol_request_t; 55 55 56 /** Volume eject flags */ 57 typedef enum { 58 /** No flags */ 59 vef_none = 0x0, 60 /** Physically eject medium */ 61 vef_physical = 0x1 62 } vol_eject_flags_t; 63 56 64 #endif 57 65 -
uspace/lib/device/include/types/vol.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 15 Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * -
uspace/lib/device/include/vol.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 15 Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 48 48 extern errno_t vol_part_add(vol_t *, service_id_t); 49 49 extern errno_t vol_part_info(vol_t *, service_id_t, vol_part_info_t *); 50 extern errno_t vol_part_eject(vol_t *, service_id_t );50 extern errno_t vol_part_eject(vol_t *, service_id_t, vol_eject_flags_t); 51 51 extern errno_t vol_part_empty(vol_t *, service_id_t); 52 52 extern errno_t vol_part_insert(vol_t *, service_id_t); -
uspace/lib/device/src/bd.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 12Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 196 196 } 197 197 198 errno_t bd_eject(bd_t *bd) 199 { 200 async_exch_t *exch = async_exchange_begin(bd->sess); 201 202 errno_t rc = async_req_0_0(exch, BD_EJECT); 203 async_exchange_end(exch); 204 205 return rc; 206 } 207 198 208 static void bd_cb_conn(ipc_call_t *icall, void *arg) 199 209 { -
uspace/lib/device/src/bd_srv.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 206 206 } 207 207 208 static void bd_eject_srv(bd_srv_t *srv, ipc_call_t *call) 209 { 210 errno_t rc; 211 212 if (srv->srvs->ops->eject == NULL) { 213 async_answer_0(call, ENOTSUP); 214 return; 215 } 216 217 rc = srv->srvs->ops->eject(srv); 218 async_answer_0(call, rc); 219 } 220 208 221 static bd_srv_t *bd_srv_create(bd_srvs_t *srvs) 209 222 { … … 276 289 bd_get_num_blocks_srv(srv, &call); 277 290 break; 291 case BD_EJECT: 292 bd_eject_srv(srv, &call); 293 break; 278 294 default: 279 295 async_answer_0(&call, EINVAL); -
uspace/lib/device/src/vol.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 15 Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 253 253 * @param vol Volume service 254 254 * @param sid Service ID of the partition 255 * @return EOK on success or an error code 256 */ 257 errno_t vol_part_eject(vol_t *vol, service_id_t sid) 258 { 259 async_exch_t *exch; 260 errno_t retval; 261 262 exch = async_exchange_begin(vol->sess); 263 retval = async_req_1_0(exch, VOL_PART_EJECT, sid); 255 * @param flags Ejection flags 256 * @return EOK on success or an error code 257 */ 258 errno_t vol_part_eject(vol_t *vol, service_id_t sid, vol_eject_flags_t flags) 259 { 260 async_exch_t *exch; 261 errno_t retval; 262 263 exch = async_exchange_begin(vol->sess); 264 retval = async_req_2_0(exch, VOL_PART_EJECT, sid, flags); 264 265 async_exchange_end(exch); 265 266 -
uspace/lib/fdisk/src/fdisk.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 819 819 errno_t rc; 820 820 821 rc = vol_part_eject(part->dev->fdisk->vol, part->svc_id );821 rc = vol_part_eject(part->dev->fdisk->vol, part->svc_id, vef_none); 822 822 if (rc != EOK) 823 823 return EIO; -
uspace/lib/scsi/include/scsi/sbc.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 11Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 50 50 SCSI_CMD_READ_CAPACITY_16 = 0x9e, 51 51 52 SCSI_CMD_START_STOP_UNIT = 0x1b, 53 52 54 SCSI_CMD_SYNC_CACHE_10 = 0x35, 53 55 SCSI_CMD_SYNC_CACHE_16 = 0x91, … … 214 216 } __attribute__((packed)) scsi_cdb_write_16_t; 215 217 218 /** SCSI Start Stop Unit command */ 219 typedef struct { 220 /** Operation code (SCSI_CMD_START_STOP_UNIT) */ 221 uint8_t op_code; 222 /** Immediate */ 223 uint8_t immed; 224 /** Reserved */ 225 uint8_t reserved_2; 226 /** Reserved */ 227 uint8_t reserved_3; 228 /** Power Conditions | Reserved | LoEj | Start */ 229 uint8_t flags; 230 /** Control */ 231 uint8_t control; 232 } __attribute__((packed)) scsi_cdb_start_stop_unit_t; 233 234 /** Constants for values in sccsi_cdb_start_stop_unit_t.flags */ 235 enum scsi_start_stop_flags { 236 ssf_pc_no_change = 0x00, 237 ssf_pc_idle = 0x10, 238 ssf_pc_standby = 0x20, 239 ssf_pc_sleep = 0x50, 240 ssf_loej = 0x02, 241 ssf_start = 0x01 242 }; 243 216 244 #endif 217 245 -
uspace/srv/bd/vbd/disk.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 35 35 36 36 #include <adt/list.h> 37 #include <bd.h> 37 38 #include <bd_srv.h> 38 39 #include <block.h> … … 71 72 static errno_t vbds_bd_get_block_size(bd_srv_t *, size_t *); 72 73 static errno_t vbds_bd_get_num_blocks(bd_srv_t *, aoff64_t *); 74 static errno_t vbds_bd_eject(bd_srv_t *); 73 75 74 76 static errno_t vbds_bsa_translate(vbds_part_t *, aoff64_t, size_t, aoff64_t *); … … 93 95 .write_blocks = vbds_bd_write_blocks, 94 96 .get_block_size = vbds_bd_get_block_size, 95 .get_num_blocks = vbds_bd_get_num_blocks 97 .get_num_blocks = vbds_bd_get_num_blocks, 98 .eject = vbds_bd_eject 96 99 }; 97 100 … … 1070 1073 1071 1074 return EOK; 1075 } 1076 1077 static errno_t vbds_bd_eject(bd_srv_t *bd) 1078 { 1079 vbds_part_t *part = bd_srv_part(bd); 1080 async_sess_t *sess; 1081 bd_t *bdc; 1082 errno_t rc; 1083 1084 log_msg(LOG_DEFAULT, LVL_DEBUG, "vbds_bd_eject()"); 1085 1086 fibril_rwlock_read_lock(&part->lock); 1087 1088 sess = loc_service_connect(part->disk->svc_id, INTERFACE_BLOCK, 0); 1089 if (sess == NULL) { 1090 log_msg(LOG_DEFAULT, LVL_WARN, 1091 "vbds_bd_eject() - failed connect"); 1092 fibril_rwlock_read_unlock(&part->lock); 1093 return EIO; 1094 } 1095 1096 rc = bd_open(sess, &bdc); 1097 if (rc != EOK) { 1098 log_msg(LOG_DEFAULT, LVL_WARN, 1099 "vbds_bd_eject() - failed open"); 1100 async_hangup(sess); 1101 fibril_rwlock_read_unlock(&part->lock); 1102 return EIO; 1103 } 1104 1105 rc = bd_eject(bdc); 1106 1107 bd_close(bdc); 1108 async_hangup(sess); 1109 1110 fibril_rwlock_read_unlock(&part->lock); 1111 return rc; 1072 1112 } 1073 1113 -
uspace/srv/system/system.c
rd231a54 r4285f384 533 533 534 534 for (i = 0; i < nparts; i++) { 535 rc = vol_part_eject(vol, part_ids[i] );535 rc = vol_part_eject(vol, part_ids[i], vef_none); 536 536 if (rc != EOK) { 537 537 log_msg(LOG_DEFAULT, LVL_ERROR, "Error ejecting " -
uspace/srv/volsrv/meson.build
rd231a54 r4285f384 1 1 # 2 # Copyright (c) 20 15 Jiri Svoboda2 # Copyright (c) 2025 Jiri Svoboda 3 3 # All rights reserved. 4 4 # … … 27 27 # 28 28 29 deps = [ 'block', ' label', 'sif' ]29 deps = [ 'block', 'device', 'label', 'sif' ] 30 30 31 31 src = files( -
uspace/srv/volsrv/part.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 37 37 #include <adt/list.h> 38 #include <bd.h> 38 39 #include <errno.h> 39 40 #include <fibril_synch.h> … … 642 643 } 643 644 644 errno_t vol_part_eject_part(vol_part_t *part) 645 static errno_t vol_part_eject_device(service_id_t svcid) 646 { 647 async_sess_t *sess; 648 errno_t rc; 649 bd_t *bd; 650 651 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_device(%zu)", 652 (size_t)svcid); 653 654 sess = loc_service_connect(svcid, INTERFACE_BLOCK, 0); 655 if (sess == NULL) 656 return EIO; 657 658 rc = bd_open(sess, &bd); 659 if (rc != EOK) { 660 async_hangup(sess); 661 return EIO; 662 } 663 664 rc = bd_eject(bd); 665 if (rc != EOK) { 666 log_msg(LOG_DEFAULT, LVL_WARN, "vol_part_eject_device(): " 667 "eject fail"); 668 bd_close(bd); 669 async_hangup(sess); 670 return EIO; 671 } 672 673 bd_close(bd); 674 async_hangup(sess); 675 return EOK; 676 } 677 678 errno_t vol_part_eject_part(vol_part_t *part, vol_eject_flags_t flags) 645 679 { 646 680 int rc; … … 667 701 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed deleting " 668 702 "mount directory %s.", part->cur_mp); 703 } 704 } 705 706 if ((flags & vef_physical) != 0) { 707 rc = vol_part_eject_device(part->svc_id); 708 if (rc != EOK) { 709 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed physically " 710 "ejecting device %s.", part->svc_name); 669 711 } 670 712 } … … 819 861 820 862 if (part->cur_mp != NULL) { 821 rc = vol_part_eject_part(part );863 rc = vol_part_eject_part(part, vef_none); 822 864 if (rc != EOK) 823 865 return rc; -
uspace/srv/volsrv/part.h
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 20 15 Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 55 55 vol_part_t **); 56 56 extern void vol_part_del_ref(vol_part_t *); 57 extern errno_t vol_part_eject_part(vol_part_t * );57 extern errno_t vol_part_eject_part(vol_part_t *, vol_eject_flags_t); 58 58 extern errno_t vol_part_empty_part(vol_part_t *); 59 59 extern errno_t vol_part_insert_part(vol_part_t *); -
uspace/srv/volsrv/volsrv.c
rd231a54 r4285f384 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 205 205 { 206 206 service_id_t sid; 207 vol_eject_flags_t flags; 207 208 vol_part_t *part; 208 209 errno_t rc; 209 210 210 211 sid = ipc_get_arg1(icall); 211 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_srv(%zu)", sid); 212 flags = ipc_get_arg2(icall); 213 214 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_srv(%zu, %x)", 215 sid, flags); 212 216 213 217 rc = vol_part_find_by_id_ref(parts, sid, &part); … … 217 221 } 218 222 219 rc = vol_part_eject_part(part );223 rc = vol_part_eject_part(part, flags); 220 224 if (rc != EOK) { 221 225 async_answer_0(icall, EIO);
Note:
See TracChangeset
for help on using the changeset viewer.