svn commit: r228349 - head/lib/libufs
Robert Millan
rmh at FreeBSD.org
Thu Dec 8 12:31:47 UTC 2011
Author: rmh
Date: Thu Dec 8 12:31:47 2011
New Revision: 228349
URL: http://svn.freebsd.org/changeset/base/228349
Log:
Make berase() work on platforms whose kernel lacks DIOCGDELETE ioctl.
Approved by: kib (mentor)
Modified:
head/lib/libufs/block.c
Modified: head/lib/libufs/block.c
==============================================================================
--- head/lib/libufs/block.c Thu Dec 8 10:42:38 2011 (r228348)
+++ head/lib/libufs/block.c Thu Dec 8 12:31:47 2011 (r228349)
@@ -139,10 +139,56 @@ bwrite(struct uufsd *disk, ufs2_daddr_t
return (cnt);
}
+#ifdef __FreeBSD_kernel__
+
+static int
+berase_helper(struct uufsd *disk, ufs2_daddr_t blockno, ufs2_daddr_t size)
+{
+ off_t ioarg[2];
+
+ ioarg[0] = blockno * disk->d_bsize;
+ ioarg[1] = size;
+ return (ioctl(disk->d_fd, DIOCGDELETE, ioarg));
+}
+
+#else
+
+static int
+berase_helper(struct uufsd *disk, ufs2_daddr_t blockno, ufs2_daddr_t size)
+{
+ char *zero_chunk;
+ off_t offset, zero_chunk_size, pwrite_size;
+ int rv;
+
+ offset = blockno * disk->d_bsize;
+ zero_chunk_size = 65536 * disk->d_bsize;
+ zero_chunk = calloc(1, zero_chunk_size);
+ if (zero_chunk == NULL) {
+ ERROR(disk, "failed to allocate memory");
+ return (-1);
+ }
+ while (size > 0) {
+ pwrite_size = size;
+ if (pwrite_size > zero_chunk_size)
+ pwrite_size = zero_chunk_size;
+ rv = pwrite(disk->d_fd, zero_chunk, pwrite_size, offset);
+ if (rv == -1) {
+ ERROR(disk, "failed writing to disk");
+ break;
+ }
+ size -= rv;
+ offset += rv;
+ rv = 0;
+ }
+ free(zero_chunk);
+ return (rv);
+}
+
+#endif
+
int
berase(struct uufsd *disk, ufs2_daddr_t blockno, ufs2_daddr_t size)
{
- off_t ioarg[2];
int rv;
ERROR(disk, NULL);
@@ -151,8 +197,5 @@ berase(struct uufsd *disk, ufs2_daddr_t
ERROR(disk, "failed to open disk for writing");
return(rv);
}
- ioarg[0] = blockno * disk->d_bsize;
- ioarg[1] = size;
- rv = ioctl(disk->d_fd, DIOCGDELETE, ioarg);
- return (rv);
+ return (berase_helper(disk, blockno, size));
}
More information about the svn-src-head
mailing list