]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/dossrv/devio.c
Backed out changeset 2737b9af622b
[plan9front.git] / sys / src / cmd / dossrv / devio.c
1 #include <u.h>
2 #include <libc.h>
3 #include "iotrack.h"
4 #include "dat.h"
5 #include "fns.h"
6
7 int readonly;
8
9 static int
10 deverror(char *name, Xfs *xf, long addr, long n, long nret)
11 {
12         errno = Eio;
13         if(nret < 0){
14                 chat("%s errstr=\"%r\"...", name);
15                 close(xf->dev);
16                 xf->dev = -1;
17                 return -1;
18         }
19         fprint(2, "dev %d sector %ld, %s: %ld, should be %ld\n", xf->dev, addr, name, nret, n);
20         return -1;
21 }
22
23 int
24 devread(Xfs *xf, vlong addr, void *buf, long n)
25 {
26         long nread;
27
28         if(xf->dev < 0)
29                 return -1;
30         nread = pread(xf->dev, buf, n, xf->offset+addr*Sectorsize);
31         if (nread == n)
32                 return 0;
33         return deverror("read", xf, addr, n, nread);
34 }
35
36 int
37 devwrite(Xfs *xf, vlong addr, void *buf, long n)
38 {
39         long nwrite;
40
41         if(xf->omode==OREAD)
42                 return -1;
43
44         if(xf->dev < 0)
45                 return -1;
46         nwrite = pwrite(xf->dev, buf, n, xf->offset+addr*Sectorsize);
47         if (nwrite == n)
48                 return 0;
49         return deverror("write", xf, addr, n, nwrite);
50 }
51
52 int
53 devcheck(Xfs *xf)
54 {
55         char buf[Sectorsize];
56
57         if(xf->dev < 0)
58                 return -1;
59         if(pread(xf->dev, buf, Sectorsize, 0) != Sectorsize){
60                 close(xf->dev);
61                 xf->dev = -1;
62                 return -1;
63         }
64         return 0;
65 }