/*
* 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
#include <afsconfig.h>
#include <afs/param.h>
+#include <roken.h>
-#include <sys/types.h>
-#include <stdio.h>
-#ifdef AFS_PTHREAD_ENV
-#include <assert.h>
-#else /* AFS_PTHREAD_ENV */
-#include <afs/assert.h>
-#endif /* AFS_PTHREAD_ENV */
#ifdef AFS_NT40_ENV
-#include <fcntl.h>
#include <windows.h>
#include <winbase.h>
-#include <io.h>
-#include <time.h>
-#else
-#include <sys/file.h>
-#include <sys/time.h>
-#include <unistd.h>
#endif
-#include <string.h>
-#include <errno.h>
-#include <sys/stat.h>
+#include <afs/afs_assert.h>
#include <rx/xdr.h>
#include <afs/afsint.h>
+#include <afs/afssyscalls.h>
+
#include "nfs.h"
#include "lwp.h"
#include "lock.h"
-#include <afs/afssyscalls.h>
#include "ihandle.h"
#include "vnode.h"
#include "volume.h"
int (*vol_PollProc) (void) = 0; /* someone must init this */
-#define ERROR_EXIT(code) {error = code; goto error_exit;}
+#define ERROR_EXIT(code) do { \
+ error = code; \
+ goto error_exit; \
+} while (0)
/* parameters for idec call - this could just be an IHandle_t, but leaving
* open the possibility of decrementing the special files as well.
ti = (struct clone_items *)malloc(sizeof(struct clone_items));
if (!ti) {
Log("ci_AddItem: malloc failed\n");
- assert(0);
+ osi_Panic("ci_AddItem: malloc failed\n");
}
ti->nitems = 0;
ti->next = (struct clone_items *)0;
Inode clinode;
struct clone_head decHead;
struct clone_rock decRock;
- afs_int32 offset = 0;
+ afs_foff_t offset = 0;
afs_int32 dircloned, inodeinced;
afs_int32 filecount = 0, diskused = 0;
+ afs_ino_str_t stmp;
struct VnodeClassInfo *vcp = &VnodeClassInfo[class];
int ReadWriteOriginal = VolumeWriteable(rwvp);
rwfile = FDH_FDOPEN(rwFd, ReadWriteOriginal ? "r+" : "r");
if (!rwfile)
ERROR_EXIT(EIO);
- STREAM_SEEK(rwfile, vcp->diskSize, 0); /* Will fail if no vnodes */
+ STREAM_ASEEK(rwfile, vcp->diskSize); /* Will fail if no vnodes */
/* Open the clone volume's index file and seek to beginning */
IH_COPY(clHout, clvp->vnodeIndex[class].handle);
clfileout = FDH_FDOPEN(clFdOut, "a");
if (!clfileout)
ERROR_EXIT(EIO);
- code = STREAM_SEEK(clfileout, vcp->diskSize, 0);
+ code = STREAM_ASEEK(clfileout, vcp->diskSize);
if (code)
ERROR_EXIT(EIO);
clfilein = FDH_FDOPEN(clFdIn, "r");
if (!clfilein)
ERROR_EXIT(EIO);
- STREAM_SEEK(clfilein, vcp->diskSize, 0); /* Will fail if no vnodes */
+ STREAM_ASEEK(clfilein, vcp->diskSize); /* Will fail if no vnodes */
}
/* Initialize list of inodes to nuke */
if (IH_INC(V_linkHandle(rwvp), rwinode, V_parentId(rwvp)) ==
-1) {
Log("IH_INC failed: %"AFS_PTR_FMT", %s, %u errno %d\n",
- V_linkHandle(rwvp), PrintInode(NULL, rwinode),
+ V_linkHandle(rwvp), PrintInode(stmp, rwinode),
V_parentId(rwvp), errno);
VForceOffline(rwvp);
ERROR_EXIT(EIO);
/* If a directory, mark vnode in old volume as cloned */
if ((rwvnode->type == vDirectory) && ReadWriteOriginal) {
#ifdef DVINC
- /*
+ /*
* It is my firmly held belief that immediately after
* copy-on-write, the two directories can be identical.
* If the new copy is changed (presumably, that is the very
rwvnode->dataVersion++;
#endif /* DVINC */
rwvnode->cloned = 1;
- code = STREAM_SEEK(rwfile, offset, 0);
+ code = STREAM_ASEEK(rwfile, offset);
if (code == -1)
goto clonefailed;
code = STREAM_WRITE(rwvnode, vcp->diskSize, 1, rwfile);
if (code != 1)
goto clonefailed;
dircloned = 1;
- code = STREAM_SEEK(rwfile, offset + vcp->diskSize, 0);
+ code = STREAM_ASEEK(rwfile, offset + vcp->diskSize);
if (code == -1)
goto clonefailed;
#ifdef DVINC
if (IH_DEC(V_linkHandle(rwvp), rwinode, V_parentId(rwvp)) ==
-1) {
Log("IH_DEC failed: %"AFS_PTR_FMT", %s, %u errno %d\n",
- V_linkHandle(rwvp), PrintInode(NULL, rwinode),
+ V_linkHandle(rwvp), PrintInode(stmp, rwinode),
V_parentId(rwvp), errno);
VForceOffline(rwvp);
ERROR_EXIT(EIO);
/* And if the directory was marked clone, unmark it */
if (dircloned) {
rwvnode->cloned = 0;
- if (STREAM_SEEK(rwfile, offset, 0) != -1)
+ if (STREAM_ASEEK(rwfile, offset) != -1)
(void)STREAM_WRITE(rwvnode, vcp->diskSize, 1, rwfile);
}
ERROR_EXIT(EIO);
/* Clean out any junk at end of clone file */
if (reclone) {
- STREAM_SEEK(clfilein, offset, 0);
+ STREAM_ASEEK(clfilein, offset);
while (STREAM_READ(clvnode, vcp->diskSize, 1, clfilein) == 1) {
if (clvnode->type != vNull && VNDISK_GET_INO(clvnode) != 0) {
ci_AddItem(&decHead, VNDISK_GET_INO(clvnode));