dir/vol: Die() really does
[openafs.git] / src / volser / physio.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 #include <roken.h>
14
15 #include <rx/xdr.h>
16 #include <rx/rx.h>
17 #include <afs/afsint.h>
18 #include <afs/nfs.h>
19 #include <afs/afs_assert.h>
20 #include <afs/dir.h>
21 #include <afs/ihandle.h>
22
23 #include "vol.h"
24 #include "physio.h"
25
26 /* returns 0 on success, errno on failure */
27 int
28 ReallyRead(DirHandle * file, int block, char *data)
29 {
30     FdHandle_t *fdP;
31     int code;
32     ssize_t nBytes;
33     errno = 0;
34     fdP = IH_OPEN(file->dirh_handle);
35     if (fdP == NULL) {
36         code = errno;
37         return code;
38     }
39     nBytes = FDH_PREAD(fdP, data, AFS_PAGESIZE, ((afs_foff_t)block) * AFS_PAGESIZE);
40     if (nBytes != AFS_PAGESIZE) {
41         if (nBytes < 0)
42             code = errno;
43         else
44             code = EIO;
45         FDH_REALLYCLOSE(fdP);
46         return code;
47     }
48     FDH_CLOSE(fdP);
49     return 0;
50 }
51
52 /* returns 0 on success, errno on failure */
53 int
54 ReallyWrite(DirHandle * file, int block, char *data)
55 {
56     FdHandle_t *fdP;
57     extern int VolumeChanged;
58     int code;
59     ssize_t nBytes;
60
61     errno = 0;
62
63     fdP = IH_OPEN(file->dirh_handle);
64     if (fdP == NULL) {
65         code = errno;
66         return code;
67     }
68     nBytes = FDH_PWRITE(fdP, data, AFS_PAGESIZE, ((afs_foff_t)block) * AFS_PAGESIZE);
69     if (nBytes != AFS_PAGESIZE) {
70         if (nBytes < 0)
71             code = errno;
72         else
73             code = EIO;
74         FDH_REALLYCLOSE(fdP);
75         return code;
76     }
77     FDH_CLOSE(fdP);
78     VolumeChanged = 1;
79     return 0;
80 }
81
82 /* SetSalvageDirHandle:
83  * Create a handle to a directory entry and reference it (IH_INIT).
84  * The handle needs to be dereferenced with the FidZap() routine.
85  */
86 void
87 SetSalvageDirHandle(DirHandle * dir, afs_uint32 volume, afs_int32 device,
88                     Inode inode)
89 {
90     private int SalvageCacheCheck = 1;
91     memset(dir, 0, sizeof(DirHandle));
92
93     dir->dirh_volume = volume;
94     dir->dirh_device = device;
95     dir->dirh_inode = inode;
96     IH_INIT(dir->dirh_handle, device, volume, inode);
97
98     /* Always re-read for a new dirhandle */
99     dir->dirh_cacheCheck = SalvageCacheCheck++;
100 }
101
102 void
103 FidZap(DirHandle * file)
104 {
105     IH_RELEASE(file->dirh_handle);
106     memset(file, 0, sizeof(DirHandle));
107 }
108
109 void
110 FidZero(DirHandle * file)
111 {
112     memset(file, 0, sizeof(DirHandle));
113 }
114
115 int
116 FidEq(DirHandle * afile, DirHandle * bfile)
117 {
118     if (afile->dirh_volume != bfile->dirh_volume)
119         return 0;
120     if (afile->dirh_device != bfile->dirh_device)
121         return 0;
122     if (afile->dirh_cacheCheck != bfile->dirh_cacheCheck)
123         return 0;
124     if (afile->dirh_inode != bfile->dirh_inode)
125         return 0;
126     return 1;
127 }
128
129 int
130 FidVolEq(DirHandle * afile, afs_int32 vid)
131 {
132     if (afile->dirh_volume != vid)
133         return 0;
134     return 1;
135 }
136
137 void
138 FidCpy(DirHandle * tofile, DirHandle * fromfile)
139 {
140     *tofile = *fromfile;
141     IH_COPY(tofile->dirh_handle, fromfile->dirh_handle);
142 }
143
144 void
145 Die(const char *msg)
146 {
147     printf("%s\n", msg);
148     osi_Panic("%s\n", msg);
149 }