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