2 * Copyright 2000, International Business Machines Corporation and others.
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
10 /* physio.c - Physical I/O routines for the buffer package */
14 /************************************************************************/
16 #include <afsconfig.h>
17 #include <afs/param.h>
21 #ifdef HAVE_SYS_FILE_H
25 #include <rx/rx_queue.h>
29 #include <afs/afsint.h>
30 #include <afs/ihandle.h>
31 #include <afs/vnode.h>
32 #include <afs/volume.h>
33 #include "viced_prototypes.h"
40 afs_int32 lpErrno
, lpCount
;
42 /* returns 0 on success, errno on failure */
44 ReallyRead(DirHandle
* file
, int block
, char *data
)
51 fdP
= IH_OPEN(file
->dirh_handle
);
55 ("ReallyRead(): open failed device %X inode %s (volume=%" AFS_VOLID_FMT
") errno %d\n",
56 file
->dirh_handle
->ih_dev
, PrintInode(stmp
,
59 afs_printable_VolumeId_lu(file
->dirh_handle
->ih_vid
), code
));
62 rdlen
= FDH_PREAD(fdP
, data
, PAGESIZE
, ((afs_foff_t
)block
) * PAGESIZE
);
63 if (rdlen
!= PAGESIZE
) {
69 ("ReallyRead(): read failed device %X inode %s (volume=%" AFS_VOLID_FMT
") errno %d\n",
70 file
->dirh_handle
->ih_dev
, PrintInode(stmp
,
73 afs_printable_VolumeId_lu(file
->dirh_handle
->ih_vid
), code
));
82 /* returns 0 on success, errno on failure */
84 ReallyWrite(DirHandle
* file
, int block
, char *data
)
90 fdP
= IH_OPEN(file
->dirh_handle
);
93 ("ReallyWrite(): open failed device %X inode %s (volume=%" AFS_VOLID_FMT
") errno %d\n",
94 file
->dirh_handle
->ih_dev
, PrintInode(stmp
,
97 afs_printable_VolumeId_lu(file
->dirh_handle
->ih_vid
), errno
));
101 if ((count
= FDH_PWRITE(fdP
, data
, PAGESIZE
, ((afs_foff_t
)block
) * PAGESIZE
)) != PAGESIZE
) {
103 ("ReallyWrite(): write failed device %X inode %s (volume=%" AFS_VOLID_FMT
") errno %d\n",
104 file
->dirh_handle
->ih_dev
, PrintInode(stmp
,
107 afs_printable_VolumeId_lu(file
->dirh_handle
->ih_vid
), errno
));
110 FDH_REALLYCLOSE(fdP
);
119 SetDirHandle(DirHandle
* dir
, Vnode
* vnode
)
121 Volume
*vp
= vnode
->volumePtr
;
123 IH_COPY(h
, vnode
->handle
);
124 dir
->dirh_ino
= h
->ih_ino
;
125 dir
->dirh_dev
= h
->ih_dev
;
126 dir
->dirh_vid
= h
->ih_vid
;
127 dir
->dirh_cacheCheck
= vp
->cacheCheck
;
128 dir
->dirh_unique
= vnode
->disk
.uniquifier
;
129 dir
->dirh_vnode
= vnode
->vnodeNumber
;
130 dir
->dirh_handle
= h
;
134 FidZap(DirHandle
* file
)
136 IH_RELEASE(file
->dirh_handle
);
137 memset(file
, 0, sizeof(DirHandle
));
141 FidZero(DirHandle
* file
)
143 memset(file
, 0, sizeof(DirHandle
));
147 FidEq(DirHandle
* afile
, DirHandle
* bfile
)
149 if (afile
->dirh_ino
!= bfile
->dirh_ino
)
151 if (afile
->dirh_dev
!= bfile
->dirh_dev
)
153 if (afile
->dirh_vid
!= bfile
->dirh_vid
)
155 if (afile
->dirh_cacheCheck
!= bfile
->dirh_cacheCheck
)
157 if (afile
->dirh_unique
!= bfile
->dirh_unique
)
159 if (afile
->dirh_vnode
!= bfile
->dirh_vnode
)
166 FidVolEq(DirHandle
* afile
, VolumeId vid
)
168 if (afile
->dirh_vid
!= vid
)
174 FidCpy(DirHandle
* tofile
, DirHandle
* fromfile
)
177 IH_COPY(tofile
->dirh_handle
, fromfile
->dirh_handle
);