summaryrefslogtreecommitdiff
path: root/libdiskfs/dev-io.c
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>1995-10-13 23:15:42 +0000
committerMiles Bader <miles@gnu.org>1995-10-13 23:15:42 +0000
commit88832f95a8473f326890eb2cf1c700c8f8e0e044 (patch)
tree67412aa1272ba44c858dfd19707a6aa233a15ffe /libdiskfs/dev-io.c
parentf26ace2b7800134d3b0992ecb563a7c67d27acb7 (diff)
Initial revision
Diffstat (limited to 'libdiskfs/dev-io.c')
-rw-r--r--libdiskfs/dev-io.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/libdiskfs/dev-io.c b/libdiskfs/dev-io.c
new file mode 100644
index 00000000..9d0ed9d0
--- /dev/null
+++ b/libdiskfs/dev-io.c
@@ -0,0 +1,54 @@
+/* Device input and output
+ Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+This file is part of the GNU Hurd.
+
+The GNU Hurd is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+The GNU Hurd is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the GNU Hurd; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <device/device.h>
+#include <device/device_request.h>
+
+#include <diskfs.h>
+
+/* Write disk block ADDR with DATA of LEN bytes to DISKFS_DEVICE, waiting for
+ completion. ADDR is offset by DISKFS_DEVICE_START. If an error occurs,
+ EIO is returned. */
+error_t
+diskfs_device_write_sync (off_t addr, vm_address_t data, size_t len)
+{
+ int written;
+ assert (!diskfs_readonly);
+ if (device_write (diskfs_device, 0, diskfs_device_start + addr,
+ (io_buf_ptr_t) data, len, &written)
+ || written != len)
+ return EIO;
+ return 0;
+}
+
+/* Read disk block ADDR from DISKFS_DEVICE; put the address of the data in
+ DATA; read LEN bytes. Always *DATA should be a full page no matter what.
+ ADDR is offset by DISKFS_DEVICE_START. If an error occurs, EIO is
+ returned. */
+error_t
+diskfs_device_read_sync (off_t addr, vm_address_t *data, size_t len)
+{
+ unsigned read;
+ if (device_read (diskfs_device, 0, diskfs_device_start + addr, len,
+ (io_buf_ptr_t *)data, &read)
+ || read != len)
+ return EIO;
+ return 0;
+}
+