Index: uspace/lib/device/src/bd.c
===================================================================
--- uspace/lib/device/src/bd.c	(revision 832cbe7f6539badd99e8e5715f4a59e044c65c44)
+++ uspace/lib/device/src/bd.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2012 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -196,4 +196,14 @@
 }
 
+errno_t bd_eject(bd_t *bd)
+{
+	async_exch_t *exch = async_exchange_begin(bd->sess);
+
+	errno_t rc = async_req_0_0(exch, BD_EJECT);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
 static void bd_cb_conn(ipc_call_t *icall, void *arg)
 {
Index: uspace/lib/device/src/bd_srv.c
===================================================================
--- uspace/lib/device/src/bd_srv.c	(revision 832cbe7f6539badd99e8e5715f4a59e044c65c44)
+++ uspace/lib/device/src/bd_srv.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -206,4 +206,17 @@
 }
 
+static void bd_eject_srv(bd_srv_t *srv, ipc_call_t *call)
+{
+	errno_t rc;
+
+	if (srv->srvs->ops->eject == NULL) {
+		async_answer_0(call, ENOTSUP);
+		return;
+	}
+
+	rc = srv->srvs->ops->eject(srv);
+	async_answer_0(call, rc);
+}
+
 static bd_srv_t *bd_srv_create(bd_srvs_t *srvs)
 {
@@ -276,4 +289,7 @@
 			bd_get_num_blocks_srv(srv, &call);
 			break;
+		case BD_EJECT:
+			bd_eject_srv(srv, &call);
+			break;
 		default:
 			async_answer_0(&call, EINVAL);
Index: uspace/lib/device/src/vol.c
===================================================================
--- uspace/lib/device/src/vol.c	(revision 832cbe7f6539badd99e8e5715f4a59e044c65c44)
+++ uspace/lib/device/src/vol.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2015 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -253,13 +253,14 @@
  * @param vol Volume service
  * @param sid Service ID of the partition
- * @return EOK on success or an error code
- */
-errno_t vol_part_eject(vol_t *vol, service_id_t sid)
-{
-	async_exch_t *exch;
-	errno_t retval;
-
-	exch = async_exchange_begin(vol->sess);
-	retval = async_req_1_0(exch, VOL_PART_EJECT, sid);
+ * @param flags Ejection flags
+ * @return EOK on success or an error code
+ */
+errno_t vol_part_eject(vol_t *vol, service_id_t sid, vol_eject_flags_t flags)
+{
+	async_exch_t *exch;
+	errno_t retval;
+
+	exch = async_exchange_begin(vol->sess);
+	retval = async_req_2_0(exch, VOL_PART_EJECT, sid, flags);
 	async_exchange_end(exch);
 
