diff options
author | phk <phk@FreeBSD.org> | 2007-12-16 18:02:37 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2007-12-16 18:02:37 +0000 |
commit | f9bd6ffc2d69fbf7654c64c285fb1ad394e53d25 (patch) | |
tree | 266edbea169e3c5da7e39384e9df2a767e149eae | |
parent | 6aefba3fce090a5d9bd5fe453607870b1a7e3770 (diff) | |
download | FreeBSD-src-f9bd6ffc2d69fbf7654c64c285fb1ad394e53d25.zip FreeBSD-src-f9bd6ffc2d69fbf7654c64c285fb1ad394e53d25.tar.gz |
Add a berase() function which uses ioctl(DIOCGDELETE) to erase a slab
of the disk.
-rw-r--r-- | lib/libufs/Makefile | 1 | ||||
-rw-r--r-- | lib/libufs/block.c | 19 | ||||
-rw-r--r-- | lib/libufs/bread.3 | 29 | ||||
-rw-r--r-- | lib/libufs/libufs.h | 1 |
4 files changed, 42 insertions, 8 deletions
diff --git a/lib/libufs/Makefile b/lib/libufs/Makefile index 8d1d9ac..10726e4 100644 --- a/lib/libufs/Makefile +++ b/lib/libufs/Makefile @@ -8,6 +8,7 @@ INCS= libufs.h MAN= bread.3 cgread.3 libufs.3 sbread.3 ufs_disk_close.3 MLINKS+= bread.3 bwrite.3 +MLINKS+= bread.3 berase.3 MLINKS+= cgread.3 cgread1.3 MLINKS+= cgread.3 cgwrite1.3 MLINKS+= sbread.3 sbwrite.3 diff --git a/lib/libufs/block.c b/lib/libufs/block.c index c4ff304..5450a5d 100644 --- a/lib/libufs/block.c +++ b/lib/libufs/block.c @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/mount.h> +#include <sys/disk.h> #include <sys/disklabel.h> #include <sys/stat.h> @@ -133,3 +134,21 @@ bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size) return (cnt); } + +int +berase(struct uufsd *disk, ufs2_daddr_t blockno, ufs2_daddr_t size) +{ + off_t ioarg[2]; + int rv; + + ERROR(disk, NULL); + rv = ufs_disk_write(disk); + if (rv == -1) { + 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); +} diff --git a/lib/libufs/bread.3 b/lib/libufs/bread.3 index 80aa921..0a9b862 100644 --- a/lib/libufs/bread.3 +++ b/lib/libufs/bread.3 @@ -31,12 +31,17 @@ .Fa "struct uufsd *disk" "ufs2_daddr_t blockno" .Fa "const void *data" "size_t size" .Fc +.Ft int +.Fo berase +.Fa "struct uufsd *disk" "ufs2_daddr_t blockno" "ufs2_daddr_t size" +.Fc .Sh DESCRIPTION The -.Fn bread -and +.Fn bread , .Fn bwrite -functions provide a block read and write API for +and +.Fn berase +functions provide a block read, write and erase API for .Xr libufs 3 consumers. They operate on a userland UFS disk structure, and perform the read @@ -50,6 +55,10 @@ and .Fn bwrite functions return the amount read or written, or \-1 in case of any error, including short read. +.Pp +The +.Fn berase +function returns non-zero on error. .Sh ERRORS The function .Fn bread @@ -59,10 +68,6 @@ for any of the errors specified for the library functions .Xr ufs_disk_write 3 or .Xr pread 2 . -Additionally, it may follow the -.Xr libufs 3 -error methodologies in situations where the amount of data read -is not equal to the amount requested, or in case of device error. .Pp The function .Fn bwrite @@ -70,7 +75,15 @@ may fail and set .Va errno for any of the errors specified for the library function .Xr pwrite 2 . -Additionally, it may follow the +.Pp +The function +.Fn berase +may fail and set +.Va errno +for any of the errors specified for the library function +.Xr ioctl 2 . +.Pp +Additionally all three functions may follow the .Xr libufs 3 error methodologies in situations where the amount of data written is not equal to the amount requested, or in case of a device error. diff --git a/lib/libufs/libufs.h b/lib/libufs/libufs.h index 92ab348..42a64f7 100644 --- a/lib/libufs/libufs.h +++ b/lib/libufs/libufs.h @@ -104,6 +104,7 @@ __BEGIN_DECLS */ ssize_t bread(struct uufsd *, ufs2_daddr_t, void *, size_t); ssize_t bwrite(struct uufsd *, ufs2_daddr_t, const void *, size_t); +int berase(struct uufsd *, ufs2_daddr_t, ufs2_daddr_t); /* * cgroup.c |