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