openafs/src/vol/physio.c

183 lines
3.6 KiB
C
Raw Normal View History

2000-11-04 10:01:08 +00:00
/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
*
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
*/
2000-11-04 02:13:13 +00:00
/*
System: VICE-TWO
Module: physio.c
Institution: The Information Technology Center, Carnegie-Mellon University
*/
#include <afsconfig.h>
#include <afs/param.h>
RCSID
("$Header$");
2000-11-04 02:13:13 +00:00
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
#ifdef AFS_NT40_ENV
#include <fcntl.h>
#else
#include <sys/file.h>
#include <unistd.h>
#ifdef HAVE_STRING_H
#include <string.h>
#else
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#endif
2000-11-04 02:13:13 +00:00
#ifdef AFS_SUN5_ENV
#include <sys/fcntl.h>
#endif
#endif
#include <rx/xdr.h>
#include <afs/afsint.h>
#include <errno.h>
#include <afs/afssyscalls.h>
#include "nfs.h"
#include "ihandle.h"
2000-11-04 02:13:13 +00:00
#include "salvage.h"
#include "afs/assert.h"
#include "afs/dir.h"
/* returns 0 on success, errno on failure */
int
ReallyRead(DirHandle * file, int block, char *data)
2000-11-04 02:13:13 +00:00
{
FdHandle_t *fdP;
int code;
errno = 0;
fdP = IH_OPEN(file->dirh_handle);
if (fdP == NULL) {
code = errno;
return code;
}
if (FDH_SEEK(fdP, block * AFS_PAGESIZE, SEEK_SET) < 0) {
2000-11-04 02:13:13 +00:00
code = errno;
FDH_REALLYCLOSE(fdP);
return code;
}
code = FDH_READ(fdP, data, (afs_fsize_t) AFS_PAGESIZE);
2000-11-04 02:13:13 +00:00
if (code != AFS_PAGESIZE) {
if (code < 0)
code = errno;
else
2000-11-04 02:13:13 +00:00
code = EIO;
FDH_REALLYCLOSE(fdP);
return code;
}
FDH_CLOSE(fdP);
return 0;
}
/* returns 0 on success, errno on failure */
int
ReallyWrite(DirHandle * file, int block, char *data)
2000-11-04 02:13:13 +00:00
{
FdHandle_t *fdP;
extern int VolumeChanged;
int code;
errno = 0;
fdP = IH_OPEN(file->dirh_handle);
if (fdP == NULL) {
code = errno;
return code;
}
if (FDH_SEEK(fdP, block * AFS_PAGESIZE, SEEK_SET) < 0) {
2000-11-04 02:13:13 +00:00
code = errno;
FDH_REALLYCLOSE(fdP);
return code;
}
code = FDH_WRITE(fdP, data, (afs_fsize_t) AFS_PAGESIZE);
2000-11-04 02:13:13 +00:00
if (code != AFS_PAGESIZE) {
if (code < 0)
code = errno;
else
2000-11-04 02:13:13 +00:00
code = EIO;
FDH_REALLYCLOSE(fdP);
return code;
}
FDH_CLOSE(fdP);
VolumeChanged = 1;
return 0;
}
/* SetSalvageDirHandle:
* Create a handle to a directory entry and reference it (IH_INIT).
* The handle needs to be dereferenced with the FidZap() routine.
*/
void
SetSalvageDirHandle(DirHandle * dir, afs_int32 volume, Device device,
Inode inode)
2000-11-04 02:13:13 +00:00
{
static SalvageCacheCheck = 1;
memset(dir, 0, sizeof(DirHandle));
2000-11-04 02:13:13 +00:00
dir->dirh_device = device;
dir->dirh_volume = volume;
dir->dirh_inode = inode;
IH_INIT(dir->dirh_handle, device, volume, inode);
2000-11-04 02:13:13 +00:00
/* Always re-read for a new dirhandle */
dir->dirh_cacheCheck = SalvageCacheCheck++;
}
void
FidZap(DirHandle * file)
2000-11-04 02:13:13 +00:00
{
IH_RELEASE(file->dirh_handle);
memset(file, 0, sizeof(DirHandle));
2000-11-04 02:13:13 +00:00
}
void
FidZero(DirHandle * file)
2000-11-04 02:13:13 +00:00
{
memset(file, 0, sizeof(DirHandle));
2000-11-04 02:13:13 +00:00
}
int
FidEq(DirHandle * afile, DirHandle * bfile)
2000-11-04 02:13:13 +00:00
{
if (afile->dirh_volume != bfile->dirh_volume)
return 0;
if (afile->dirh_device != bfile->dirh_device)
return 0;
if (afile->dirh_cacheCheck != bfile->dirh_cacheCheck)
return 0;
if (afile->dirh_inode != bfile->dirh_inode)
return 0;
2000-11-04 02:13:13 +00:00
return 1;
}
int
FidVolEq(DirHandle * afile, afs_int32 vid)
2000-11-04 02:13:13 +00:00
{
if (afile->dirh_volume != vid)
return 0;
2000-11-04 02:13:13 +00:00
return 1;
}
void
FidCpy(DirHandle * tofile, DirHandle * fromfile)
2000-11-04 02:13:13 +00:00
{
*tofile = *fromfile;
IH_COPY(tofile->dirh_handle, fromfile->dirh_handle);
}
void
Die(char *msg)
2000-11-04 02:13:13 +00:00
{
printf("%s\n", msg);
assert(1 == 2);
2000-11-04 02:13:13 +00:00
}