Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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, long 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+(vlong)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, long 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+(vlong)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
}