Deleted Added
full compact
block.c (116084) block.c (120874)
1/*
2 * Copyright (c) 2002 Juli Mallett. All rights reserved.
3 *
4 * This software was written by Juli Mallett <jmallett@FreeBSD.org> for the
5 * FreeBSD project. Redistribution and use in source and binary forms, with
6 * or without modification, are permitted provided that the following
7 * conditions are met:
8 *

--- 12 unchanged lines hidden (view full) ---

21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
1/*
2 * Copyright (c) 2002 Juli Mallett. All rights reserved.
3 *
4 * This software was written by Juli Mallett <jmallett@FreeBSD.org> for the
5 * FreeBSD project. Redistribution and use in source and binary forms, with
6 * or without modification, are permitted provided that the following
7 * conditions are met:
8 *

--- 12 unchanged lines hidden (view full) ---

21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/lib/libufs/block.c 116084 2003-06-09 09:32:29Z jmallett $");
29__FBSDID("$FreeBSD: head/lib/libufs/block.c 120874 2003-10-07 07:12:22Z phk $");
30
31#include <sys/param.h>
32#include <sys/mount.h>
33#include <sys/disklabel.h>
34#include <sys/stat.h>
35
36#include <ufs/ufs/ufsmount.h>
37#include <ufs/ufs/dinode.h>
38#include <ufs/ffs/fs.h>
39
40#include <errno.h>
41#include <fcntl.h>
42#include <stdio.h>
30
31#include <sys/param.h>
32#include <sys/mount.h>
33#include <sys/disklabel.h>
34#include <sys/stat.h>
35
36#include <ufs/ufs/ufsmount.h>
37#include <ufs/ufs/dinode.h>
38#include <ufs/ffs/fs.h>
39
40#include <errno.h>
41#include <fcntl.h>
42#include <stdio.h>
43#include <stdlib.h>
43#include <string.h>
44#include <unistd.h>
45
46#include <libufs.h>
47
48ssize_t
49bread(struct uufsd *disk, ufs2_daddr_t blockno, void *data, size_t size)
50{
44#include <string.h>
45#include <unistd.h>
46
47#include <libufs.h>
48
49ssize_t
50bread(struct uufsd *disk, ufs2_daddr_t blockno, void *data, size_t size)
51{
51 char *buf;
52 void *p2;
52 ssize_t cnt;
53
54 ERROR(disk, NULL);
55
53 ssize_t cnt;
54
55 ERROR(disk, NULL);
56
57 p2 = data;
56 /*
58 /*
57 * For when we need to work with the data as a buffer.
59 * XXX: various disk controllers require alignment of our buffer
60 * XXX: which is stricter than struct alignment.
61 * XXX: Bounce the buffer if not 64 byte aligned.
62 * XXX: this can be removed if/when the kernel is fixed
58 */
63 */
59 buf = data;
60
61 cnt = pread(disk->d_fd, data, size, (off_t)(blockno * disk->d_bsize));
64 if (((intptr_t)data) & 0x3f) {
65 p2 = malloc(size);
66 if (p2 == NULL)
67 ERROR(disk, "allocate bounce buffer");
68 }
69 cnt = pread(disk->d_fd, p2, size, (off_t)(blockno * disk->d_bsize));
62 if (cnt == -1) {
63 ERROR(disk, "read error from block device");
64 goto fail;
65 }
66 if (cnt == 0) {
67 ERROR(disk, "end of file from block device");
68 goto fail;
69 }
70 if ((size_t)cnt != size) {
71 ERROR(disk, "short read or read error from block device");
72 goto fail;
73 }
70 if (cnt == -1) {
71 ERROR(disk, "read error from block device");
72 goto fail;
73 }
74 if (cnt == 0) {
75 ERROR(disk, "end of file from block device");
76 goto fail;
77 }
78 if ((size_t)cnt != size) {
79 ERROR(disk, "short read or read error from block device");
80 goto fail;
81 }
82 if (p2 != data) {
83 memcpy(data, p2, size);
84 free(p2);
85 }
74 return (cnt);
86 return (cnt);
75fail: memset(buf, 0, size);
87fail: memset(data, 0, size);
88 if (p2 != data) {
89 free(p2);
90 }
76 return (-1);
77}
78
79ssize_t
80bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size)
81{
82 ssize_t cnt;
83 int rv;
91 return (-1);
92}
93
94ssize_t
95bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size)
96{
97 ssize_t cnt;
98 int rv;
99 void *p2 = NULL;
84
85 ERROR(disk, NULL);
86
87 rv = ufs_disk_write(disk);
88 if (rv == -1) {
89 ERROR(disk, "failed to open disk for writing");
90 return (-1);
91 }
92
100
101 ERROR(disk, NULL);
102
103 rv = ufs_disk_write(disk);
104 if (rv == -1) {
105 ERROR(disk, "failed to open disk for writing");
106 return (-1);
107 }
108
109 /*
110 * XXX: various disk controllers require alignment of our buffer
111 * XXX: which is stricter than struct alignment.
112 * XXX: Bounce the buffer if not 64 byte aligned.
113 * XXX: this can be removed if/when the kernel is fixed
114 */
115 if (((intptr_t)data) & 0x3f) {
116 p2 = malloc(size);
117 if (p2 == NULL)
118 ERROR(disk, "allocate bounce buffer");
119 memcpy(p2, data, size);
120 data = p2;
121 }
93 cnt = pwrite(disk->d_fd, data, size, (off_t)(blockno * disk->d_bsize));
122 cnt = pwrite(disk->d_fd, data, size, (off_t)(blockno * disk->d_bsize));
123 if (p2 != NULL)
124 free(p2);
94 if (cnt == -1) {
95 ERROR(disk, "write error to block device");
96 return (-1);
97 }
98 if ((size_t)cnt != size) {
99 ERROR(disk, "short write to block device");
100 return (-1);
101 }
102
103 return (cnt);
104}
125 if (cnt == -1) {
126 ERROR(disk, "write error to block device");
127 return (-1);
128 }
129 if ((size_t)cnt != size) {
130 ERROR(disk, "short write to block device");
131 return (-1);
132 }
133
134 return (cnt);
135}