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} |