Blame


1 0c98da8b 2005-07-13 devnull #include <u.h>
2 0c98da8b 2005-07-13 devnull #include <libc.h>
3 0c98da8b 2005-07-13 devnull #include <diskfs.h>
4 0c98da8b 2005-07-13 devnull
5 d3285dcb 2005-12-16 devnull int nfilereads;
6 6519f895 2007-11-05 rsc void _nfilereads_darwin_sucks(void) { }
7 d3285dcb 2005-12-16 devnull
8 0c98da8b 2005-07-13 devnull typedef struct DiskFile DiskFile;
9 0c98da8b 2005-07-13 devnull struct DiskFile
10 0c98da8b 2005-07-13 devnull {
11 0c98da8b 2005-07-13 devnull Disk disk;
12 0c98da8b 2005-07-13 devnull int fd;
13 0c98da8b 2005-07-13 devnull };
14 0c98da8b 2005-07-13 devnull
15 0c98da8b 2005-07-13 devnull static long
16 0c98da8b 2005-07-13 devnull preadn(int fd, void *vdata, u32int ulen, u64int offset)
17 0c98da8b 2005-07-13 devnull {
18 0c98da8b 2005-07-13 devnull long n;
19 0c98da8b 2005-07-13 devnull uchar *data;
20 0c98da8b 2005-07-13 devnull long len;
21 0c98da8b 2005-07-13 devnull
22 0c98da8b 2005-07-13 devnull nfilereads++;
23 0c98da8b 2005-07-13 devnull len = ulen;
24 0c98da8b 2005-07-13 devnull data = vdata;
25 cbeb0b26 2006-04-01 devnull /* fprint(2, "readn 0x%llux 0x%ux\n", offset, ulen); */
26 0c98da8b 2005-07-13 devnull while(len > 0){
27 0c98da8b 2005-07-13 devnull n = pread(fd, data, len, offset);
28 0c98da8b 2005-07-13 devnull if(n <= 0)
29 0c98da8b 2005-07-13 devnull break;
30 0c98da8b 2005-07-13 devnull data += n;
31 0c98da8b 2005-07-13 devnull offset += n;
32 0c98da8b 2005-07-13 devnull len -= n;
33 0c98da8b 2005-07-13 devnull }
34 0c98da8b 2005-07-13 devnull return data-(uchar*)vdata;
35 0c98da8b 2005-07-13 devnull }
36 0c98da8b 2005-07-13 devnull
37 0c98da8b 2005-07-13 devnull static void
38 0c98da8b 2005-07-13 devnull diskfileblockput(Block *b)
39 0c98da8b 2005-07-13 devnull {
40 0c98da8b 2005-07-13 devnull free(b);
41 0c98da8b 2005-07-13 devnull }
42 0c98da8b 2005-07-13 devnull
43 0c98da8b 2005-07-13 devnull uvlong nreadx;
44 0c98da8b 2005-07-13 devnull static Block*
45 0c98da8b 2005-07-13 devnull diskfileread(Disk *dd, u32int len, u64int offset)
46 0c98da8b 2005-07-13 devnull {
47 0c98da8b 2005-07-13 devnull int n;
48 0c98da8b 2005-07-13 devnull Block *b;
49 0c98da8b 2005-07-13 devnull DiskFile *d = (DiskFile*)dd;
50 0c98da8b 2005-07-13 devnull
51 0c98da8b 2005-07-13 devnull b = mallocz(sizeof(Block)+len, 1);
52 0c98da8b 2005-07-13 devnull if(b == nil)
53 0c98da8b 2005-07-13 devnull return nil;
54 0c98da8b 2005-07-13 devnull b->data = (uchar*)&b[1];
55 0c98da8b 2005-07-13 devnull nreadx += len;
56 0c98da8b 2005-07-13 devnull n = preadn(d->fd, b->data, len, offset);
57 0c98da8b 2005-07-13 devnull if(n <= 0){
58 0c98da8b 2005-07-13 devnull free(b);
59 0c98da8b 2005-07-13 devnull return nil;
60 0c98da8b 2005-07-13 devnull }
61 0c98da8b 2005-07-13 devnull b->_close = diskfileblockput;
62 0c98da8b 2005-07-13 devnull b->len = n;
63 0c98da8b 2005-07-13 devnull return b;
64 0c98da8b 2005-07-13 devnull }
65 0c98da8b 2005-07-13 devnull
66 0c98da8b 2005-07-13 devnull static int
67 0c98da8b 2005-07-13 devnull diskfilesync(Disk *dd)
68 0c98da8b 2005-07-13 devnull {
69 0c98da8b 2005-07-13 devnull USED(dd);
70 0c98da8b 2005-07-13 devnull return 0;
71 0c98da8b 2005-07-13 devnull }
72 0c98da8b 2005-07-13 devnull
73 0c98da8b 2005-07-13 devnull static void
74 0c98da8b 2005-07-13 devnull diskfileclose(Disk *dd)
75 0c98da8b 2005-07-13 devnull {
76 0c98da8b 2005-07-13 devnull DiskFile *d = (DiskFile*)dd;
77 0c98da8b 2005-07-13 devnull
78 0c98da8b 2005-07-13 devnull close(d->fd);
79 0c98da8b 2005-07-13 devnull free(d);
80 0c98da8b 2005-07-13 devnull }
81 0c98da8b 2005-07-13 devnull
82 0c98da8b 2005-07-13 devnull Disk*
83 0c98da8b 2005-07-13 devnull diskopenfile(char *file)
84 0c98da8b 2005-07-13 devnull {
85 0c98da8b 2005-07-13 devnull int fd;
86 0c98da8b 2005-07-13 devnull DiskFile *d;
87 0c98da8b 2005-07-13 devnull
88 0c98da8b 2005-07-13 devnull if((fd = open(file, OREAD)) < 0)
89 0c98da8b 2005-07-13 devnull return nil;
90 0c98da8b 2005-07-13 devnull d = mallocz(sizeof(DiskFile), 1);
91 0c98da8b 2005-07-13 devnull if(d == nil){
92 0c98da8b 2005-07-13 devnull close(fd);
93 0c98da8b 2005-07-13 devnull return nil;
94 0c98da8b 2005-07-13 devnull }
95 0c98da8b 2005-07-13 devnull d->disk._read = diskfileread;
96 0c98da8b 2005-07-13 devnull d->disk._sync = diskfilesync;
97 0c98da8b 2005-07-13 devnull d->disk._close = diskfileclose;
98 0c98da8b 2005-07-13 devnull d->fd = fd;
99 0c98da8b 2005-07-13 devnull return &d->disk;
100 0c98da8b 2005-07-13 devnull }