else {
printf("afs_linux_readdir: afs_dir_GetBlob failed, null name (inode %lx, dirpos %d)\n",
(unsigned long)&tdc->f.inode, dirpos);
- DRelease((struct buffer *) de, 0);
+ DRelease(de, 0);
ReleaseSharedLock(&avc->lock);
afs_PutDCache(tdc);
code = -ENOENT;
#else
code = (*filldir) (dirbuf, de->name, len, offset, ino);
#endif
- DRelease((struct buffer *)de, 0);
+ DRelease(de, 0);
if (code)
break;
offset = dirpos + 1 + ((len + 16) >> 5);
/* dont copy more than we have room for */
if (fidIndex >= nentries) {
- DRelease((struct buffer *)dirEntryp, 0);
+ DRelease(dirEntryp, 0);
break;
}
}
if (!tvcp)
{
- DRelease((struct buffer *)dirEntryp, 0);
+ DRelease(dirEntryp, 0);
ReleaseReadLock(&dcp->lock);
ReleaseReadLock(&adp->lock);
afs_PutDCache(dcp);
* used by this dir entry.
*/
temp = afs_dir_NameBlobs(dirEntryp->name) << 5;
- DRelease((struct buffer *)dirEntryp, 0);
+ DRelease(dirEntryp, 0);
if (temp <= 0)
break;
dirCookie += temp;
}
/* now relativeBlob is the page-relative first allocated blob,
* or EPP (if there are none in this page). */
- DRelease((struct buffer *)tpe, 0);
+ DRelease(tpe, 0);
if (i != EPP)
return i + pageBlob;
ablob = pageBlob + EPP; /* go around again */
*eofp = 1; /* Set it properly */
#endif
if (ode)
- DRelease((struct buffer *)ode, 0);
+ DRelease(ode, 0);
goto dirend;
}
/* by here nde is set */
if (DIRSIZ_LEN(n_slen) >= (AFS_UIO_RESID(auio) - len)) {
#endif /* AFS_SGI53_ENV */
/* No can do no more now; ya know... at this time */
- DRelease((struct buffer *)nde, 0); /* can't use this one. */
+ DRelease(nde, 0); /* can't use this one. */
if (len) {
#ifdef AFS_HPUX_ENV
sdirEntry->d_fileno =
code = EINVAL;
}
if (ode)
- DRelease((struct buffer *)ode, 0);
+ DRelease(ode, 0);
goto dirend;
}
len = DIRSIZ_LEN(o_slen = n_slen);
#endif /* AFS_SGI53_ENV */
if (ode)
- DRelease((struct buffer *)ode, 0);
+ DRelease(ode, 0);
ode = nde;
AFS_UIO_SETOFFSET(auio, (afs_int32) ((us + afs_dir_NameBlobs(nde->name)) << 5));
}
if (ode)
- DRelease((struct buffer *)ode, 0);
+ DRelease(ode, 0);
dirend:
ReleaseReadLock(&tdc->lock);
}
void
-DRelease(register struct buffer *bp, int flag)
+DRelease(void *loc, int flag)
{
/* Release a buffer, specifying whether or not the buffer has been
* modified by the locker. */
+ register struct buffer *bp = (struct buffer *)loc;
register int index;
#if defined(AFS_USEBUFFERS)
register struct buffer *tp;
/* afs_buffer.c */
extern void DInit(int abuffers);
extern void *DRead(register struct dcache * fid, register int page);
-extern void DRelease(register struct buffer *bp, int flag);
extern int DVOffset(register void *ap);
extern void DZap(struct dcache * fid);
extern void DFlush(void);
return lp;
}
+/* Release a buffer, specifying whether or not the buffer has been modified
+ * by the locker. */
void
-DRelease(register struct buffer *bp, int flag)
+DRelease(void *loc, int flag)
{
- /* Release a buffer, specifying whether or not the buffer has been modified by the locker. */
+ struct buffer *bp = (struct buffer *)loc;
register int index;
if (!bp)
unsigned short **previtem);
+/* Find out how many entries are required to store a name. */
int
NameBlobs(char *name)
-{ /* Find out how many entries are required to store a name. */
+{
register int i;
i = strlen(name) + 1;
return 1 + ((i + 15) >> 5);
}
-/* Create an entry in a file. Dir is a file representation, while entry is a string name. */
-
+/* Create an entry in a file. Dir is a file representation, while entry is
+ * a string name. */
int
Create(void *dir, char *entry, void *voidfid)
{
/* First check if file already exists. */
ep = FindItem(dir, entry, &pp);
if (ep) {
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)pp, 0);
+ DRelease(ep, 0);
+ DRelease(pp, 0);
return EEXIST;
}
blobs = NameBlobs(entry); /* number of entries required */
/* Now we just have to thread it on the hash table list. */
dhp = (struct DirHeader *)DRead(dir, 0);
if (!dhp) {
- DRelease((struct buffer *)ep, 1);
+ DRelease(ep, 1);
return EIO;
}
i = DirHash(entry);
ep->next = dhp->hashTable[i];
dhp->hashTable[i] = htons(firstelt);
- DRelease((struct buffer *)dhp, 1);
- DRelease((struct buffer *)ep, 1);
+ DRelease(dhp, 1);
+ DRelease(ep, 1);
return 0;
}
if (dhp->alloMap[i] != EPP)
ctr++;
}
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return ctr * AFS_PAGESIZE;
}
if (firstitem == 0)
return ENOENT;
*previtem = firstitem->next;
- DRelease((struct buffer *)previtem, 1);
+ DRelease(previtem, 1);
index = DVOffset(firstitem) / 32;
nitems = NameBlobs(firstitem->name);
- DRelease((struct buffer *)firstitem, 0);
+ DRelease(firstitem, 0);
FreeBlobs(dir, index, nitems);
return 0;
}
}
pp = (struct PageHeader *)DRead(dir, i); /* read the page in. */
if (!pp) {
- DRelease((struct buffer *)dhp, 1);
+ DRelease(dhp, 1);
break;
}
for (j = 0; j <= EPP - nblobs; j++) {
* and free up any resources we've got allocated. */
if (i < MAXPAGES)
dhp->alloMap[i] -= nblobs;
- DRelease((struct buffer *)dhp, 1);
+ DRelease(dhp, 1);
for (k = 0; k < nblobs; k++)
pp->freebitmap[(j + k) >> 3] |= 1 << ((j + k) & 7);
- DRelease((struct buffer *)pp, 1);
+ DRelease(pp, 1);
return j + i * EPP;
}
- DRelease((struct buffer *)pp, 0); /* This dir page is unchanged. */
+ DRelease(pp, 0); /* This dir page is unchanged. */
}
}
/* If we make it here, the directory is full. */
- DRelease((struct buffer *)dhp, 1);
+ DRelease(dhp, 1);
return -1;
}
pp->freebitmap[0] = 0x01;
for (i = 1; i < EPP / 8; i++) /* It's a constant */
pp->freebitmap[i] = 0;
- DRelease((struct buffer *)pp, 1);
+ DRelease(pp, 1);
}
/* Free a whole bunch of directory entries. */
return;
if (page < MAXPAGES)
dhp->alloMap[page] += nblobs;
- DRelease((struct buffer *)dhp, 1);
+ DRelease(dhp, 1);
pp = (struct PageHeader *)DRead(dir, page);
if (pp)
for (i = 0; i < nblobs; i++)
pp->freebitmap[(firstblob + i) >> 3] &=
~(1 << ((firstblob + i) & 7));
- DRelease((struct buffer *)pp, 1);
+ DRelease(pp, 1);
}
/*
dhp->alloMap[i] = EPP;
for (i = 0; i < NHASHENT; i++)
dhp->hashTable[i] = 0;
- DRelease((struct buffer *)dhp, 1);
+ DRelease(dhp, 1);
Create(dir, ".", me);
Create(dir, "..", parent); /* Virtue is its own .. */
return 0;
firstitem = FindItem(dir, entry, &previtem);
if (firstitem == 0)
return ENOENT;
- DRelease((struct buffer *)previtem, 0);
+ DRelease(previtem, 0);
fid[1] = ntohl(firstitem->fid.vnode);
fid[2] = ntohl(firstitem->fid.vunique);
- DRelease((struct buffer *)firstitem, 0);
+ DRelease(firstitem, 0);
return 0;
}
firstitem = FindItem(dir, entry, &previtem);
if (firstitem == 0)
return ENOENT;
- DRelease((struct buffer *)previtem, 0);
+ DRelease(previtem, 0);
fid[1] = ntohl(firstitem->fid.vnode);
fid[2] = ntohl(firstitem->fid.vunique);
if (offsetp)
*offsetp = DVOffset(firstitem);
- DRelease((struct buffer *)firstitem, 0);
+ DRelease(firstitem, 0);
return 0;
}
if (!ep) {
if (DErrno) {
/* we failed, return why */
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return DErrno;
}
break;
num = ntohs(ep->next);
code = (*hookproc) (hook, ep->name, ntohl(ep->fid.vnode),
ntohl(ep->fid.vunique));
- DRelease((struct buffer *)ep, 0);
+ DRelease(ep, 0);
if (code)
break;
}
}
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
if (!ep)
break;
if (strcmp(ep->name, "..") && strcmp(ep->name, ".")) {
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 1;
}
num = ntohs(ep->next);
- DRelease((struct buffer *)ep, 0);
+ DRelease(ep, 0);
}
}
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
return tval;
}
+
+/* Find a directory entry, given its name. This entry returns a pointer
+ * to a locked buffer, and a pointer to a locked buffer (in previtem)
+ * referencing the found item (to aid the delete code). If no entry is
+ * found, however, no items are left locked, and a null pointer is
+ * returned instead. */
+
static struct DirEntry *
FindItem(void *dir, char *ename, unsigned short **previtem)
{
- /* Find a directory entry, given its name. This entry returns a pointer to a locked buffer, and a pointer to a locked buffer (in previtem) referencing the found item (to aid the delete code). If no entry is found, however, no items are left locked, and a null pointer is returned instead. */
register int i;
register struct DirHeader *dhp;
register unsigned short *lp;
return 0;
if (dhp->hashTable[i] == 0) {
/* no such entry */
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
tp = GetBlob(dir, (u_short) ntohs(dhp->hashTable[i]));
if (!tp) {
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
lp = &(dhp->hashTable[i]);
*previtem = lp;
return tp;
}
- DRelease((struct buffer *)lp, 0);
+ DRelease(lp, 0);
lp = &(tp->next);
if (tp->next == 0) {
/* The end of the line */
- DRelease((struct buffer *)lp, 0); /* Release all locks. */
+ DRelease(lp, 0); /* Release all locks. */
return 0;
}
tp = GetBlob(dir, (u_short) ntohs(tp->next));
if (!tp) {
- DRelease((struct buffer *)lp, 0);
+ DRelease(lp, 0);
return 0;
}
}
while(tp) {
if (vnode == ntohl(tp->fid.vnode)
&& unique == ntohl(tp->fid.vunique)) {
- DRelease(dhp,0);
+ DRelease(dhp, 0);
return tp;
}
lp = &(tp->next);
if (tp->next == 0)
break;
tp = GetBlob(dir,(u_short)ntohs(tp->next));
- DRelease(lp,0);
+ DRelease(lp, 0);
}
- DRelease(lp,0);
+ DRelease(lp, 0);
}
}
- DRelease(dhp,0);
- return (struct DirEntry *)0;
+ DRelease(dhp, 0);
+ return NULL;
}
int
extern int DirHash(register char *string);
extern int DStat(int *abuffers, int *acalls, int *aios);
-extern void DRelease(struct buffer *bp, int flag);
+extern void DRelease(void *loc, int flag);
extern int DVOffset(register void *ap);
extern int DFlushVolume(register afs_int32 vid);
extern int DFlushEntry(register afs_int32 *fid);
/* Check magic number for first page */
if (dhp->header.tag != htons(1234)) {
printf("Bad first pageheader magic number.\n");
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
* two must exist for "." and ".."
*/
printf("The dir header alloc map for page %d is bad.\n", i);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
} else {
if ((j < 0) || (j > EPP)) {
printf("The dir header alloc map for page %d is bad.\n", i);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
}
printf
("A partially-full page occurs in slot %d, after the dir end.\n",
i);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
} else if (j == EPP) { /* is this the last page */
if (usedPages < up) {
printf
("Count of used directory pages does not match count in directory header\n");
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
/* Read the page header */
pp = (struct PageHeader *)DRead(file, i);
if (!pp) {
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
if (DErrno != 0) {
/* couldn't read page, but not because it wasn't there permanently */
printf("Failed to read dir page %d (errno %d)\n", i, DErrno);
/* check the tag field */
if (pp->tag != htons(1234)) {
printf("Directory page %d has a bad magic number.\n", i);
- DRelease((struct buffer *)pp, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(pp, 0);
+ DRelease(dhp, 0);
return 0;
}
printf
("Header alloMap count doesn't match count in freebitmap for page %d.\n",
i);
- DRelease((struct buffer *)pp, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(pp, 0);
+ DRelease(dhp, 0);
return 0;
}
- DRelease((struct buffer *)pp, 0);
+ DRelease(pp, 0);
}
/* Initialize the in-memory freebit map for all pages. */
/* Verify that the entry is within range */
if (entry < 0 || entry >= maxents) {
printf("Out-of-range hash id %d in chain %d.\n", entry, i);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
*/
printf("Could not get dir blob %d (errno %d)\n", entry,
DErrno);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
Die("dirok3");
}
printf("Invalid hash id %d in chain %d.\n", entry, i);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
ne = ntohs(ep->next);
/* There can't be more than maxents entries */
if (++entcount >= maxents) {
printf("Directory's hash chain %d is circular.\n", i);
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 0;
}
if (ep->name[0] == '\000') {
printf("Dir entry %x in chain %d has bogus (null) name.\n",
(int)ep, i);
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 0;
}
if (ep->flag != FFIRST) {
printf("Dir entry %x in chain %d has bogus flag field.\n", (int)ep,
i);
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 0;
}
if (j >= MAXENAME) { /* MAXENAME counts the null */
printf("Dir entry %x in chain %d has too-long name.\n", (int)ep,
i);
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 0;
}
printf
("Dir entry %x should be in hash bucket %d but IS in %d.\n",
(int)ep, j, i);
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 0;
}
printf
("Dir entry %x, index 13 has name '%s' should be '.'\n",
(int)ep, ep->name);
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 0;
}
}
printf
("Dir entry %x, index 14 has name '%s' should be '..'\n",
(int)ep, ep->name);
- DRelease((struct buffer *)ep, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(ep, 0);
+ DRelease(dhp, 0);
return 0;
}
}
/* CHECK FOR DUPLICATE NAMES? */
- DRelease((struct buffer *)ep, 0);
+ DRelease(ep, 0);
}
}
if (!havedot || !havedotdot) {
printf
("Directory entry '.' or '..' does not exist or is in the wrong index.\n");
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}
printf
("Failed on second attempt to read dir page %d (errno %d)\n",
i, DErrno);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
/* if DErrno is 0, then the dir is really bad, and we return dir *not* OK.
* otherwise, we want to return true (1), meaning the dir isn't known
* to be bad (we can't tell, since I/Os are failing.
printf
("Entry freebitmap error, page %d, map offset %d, %x should be %x.\n",
i, j, pp->freebitmap[j], eaMap[count + j]);
- DRelease((struct buffer *)pp, 0);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(pp, 0);
+ DRelease(dhp, 0);
return 0;
}
}
- DRelease((struct buffer *)pp, 0);
+ DRelease(pp, 0);
}
/* Finally cleanup and return. */
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 1;
}
* parent directory.
*/
int
-DirSalvage(char *fromFile, char *toFile, afs_int32 vn, afs_int32 vu,
+DirSalvage(void *fromFile, void *toFile, afs_int32 vn, afs_int32 vu,
afs_int32 pvn, afs_int32 pvu)
{
/* First do a MakeDir on the target. */
printf
("can't continue down hash chain (entry %d, errno %d)\n",
entry, DErrno);
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return DErrno;
}
printf
printf
("Create of %s returned code %d, skipping to next hash chain.\n",
tname, code);
- DRelease((struct buffer *)ep, 0);
+ DRelease(ep, 0);
break;
}
}
- DRelease((struct buffer *)ep, 0);
+ DRelease(ep, 0);
}
}
/* Clean up things. */
- DRelease((struct buffer *)dhp, 0);
+ DRelease(dhp, 0);
return 0;
}