#include <afsconfig.h>
#include "afs/param.h"
-RCSID
- ("$Header$");
/*
* SOLARIS/osi_vnodeops.c
#include <vm/seg_map.h>
#include <vm/seg_vn.h>
#include <vm/rm.h>
+#if defined(AFS_SUN511_ENV)
+#include <sys/vfs_opreg.h>
+#endif
#include <sys/modctl.h>
#include <sys/syscall.h>
#include <sys/debug.h>
#include <sys/fs_subr.h>
-/*
- * XXX Temporary fix for problems with Solaris rw_tryupgrade() lock.
- * It isn't very persistent in getting the upgrade when others are
- * waiting for it and returns 0. So the UpgradeSToW() macro that the
- * rw_tryupgrade used to map to wasn't good enough and we need to use
- * the following code instead. Obviously this isn't the proper place
- * for it but it's only called from here for now
- *
- */
-#ifndef AFS_SUN54_ENV
-AFS_TRYUP(lock)
- afs_rwlock_t *lock;
-{
- if (!rw_tryupgrade(lock)) {
- rw_exit(lock);
- rw_enter(lock, RW_WRITER);
- }
-}
-#endif
-
-
/* Translate a faultcode_t as returned by some of the vm routines
* into a suitable errno value.
*/
int afs_pvn_vptrunc;
int
-afs_addmap(avp, offset, asp, addr, length, prot, maxprot, flags, credp)
- register struct vnode *avp;
- offset_t offset;
- struct as *asp;
- caddr_t addr;
- int length, prot, maxprot, flags;
- struct AFS_UCRED *credp;
+afs_addmap(register struct vnode *avp, offset_t offset, struct as *asp,
+ caddr_t addr, int length, int prot, int maxprot, int flags,
+ AFS_UCRED *credp)
{
/* XXX What should we do here?? XXX */
return (0);
}
int
-afs_delmap(avp, offset, asp, addr, length, prot, maxprot, flags, credp)
- register struct vnode *avp;
- offset_t offset;
- struct as *asp;
- caddr_t addr;
- int length, prot, maxprot, flags;
- struct AFS_UCRED *credp;
+afs_delmap(register struct vnode *avp, offset_t offset, struct as *asp,
+ caddr_t addr, int length, int prot, int maxprot, int flags,
+ AFS_UCRED *credp)
{
/* XXX What should we do here?? XXX */
return (0);
#ifdef AFS_SUN510_ENV
int
-afs_vmread(avp, auio, ioflag, acred, ct)
- register struct vnode *avp;
- struct uio *auio;
- int ioflag;
- struct AFS_UCRED *acred;
- caller_context_t *ct;
+afs_vmread(register struct vnode *avp, struct uio *auio, int ioflag,
+ AFS_UCRED *acred, caller_context_t *ct)
#else
int
-afs_vmread(avp, auio, ioflag, acred)
- register struct vnode *avp;
- struct uio *auio;
- int ioflag;
- struct AFS_UCRED *acred;
+afs_vmread(register struct vnode *avp, struct uio *auio, int ioflag,
+ AFS_UCRED *acred)
#endif
{
register int code;
#ifdef AFS_SUN510_ENV
int
-afs_vmwrite(avp, auio, ioflag, acred, ct)
- register struct vnode *avp;
- struct uio *auio;
- int ioflag;
- struct AFS_UCRED *acred;
- caller_context_t *ct;
+afs_vmwrite(register struct vnode *avp, struct uio *auio, int ioflag,
+ AFS_UCRED *acred, caller_context_t *ct)
#else
int
-afs_vmwrite(avp, auio, ioflag, acred)
- register struct vnode *avp;
- struct uio *auio;
- int ioflag;
- struct AFS_UCRED *acred;
+afs_vmwrite(register struct vnode *avp, struct uio *auio, int ioflag,
+ AFS_UCRED *acred)
#endif
{
register int code;
}
int
-afs_getpage(vp, off, len, protp, pl, plsz, seg, addr, rw, acred)
- struct vnode *vp;
- u_int len;
- u_int *protp;
- struct page *pl[];
- u_int plsz;
- struct seg *seg;
- offset_t off;
- caddr_t addr;
- enum seg_rw rw;
- struct AFS_UCRED *acred;
+afs_getpage(struct vnode *vp, offset_t off, u_int len, u_int *protp,
+ struct page *pl[], u_int plsz, struct seg *seg, caddr_t addr,
+ enum seg_rw rw, AFS_UCRED *acred)
{
register afs_int32 code = 0;
AFS_STATCNT(afs_getpage);
AFS_GLOCK();
-#if defined(AFS_SUN56_ENV)
- if (len <= PAGESIZE)
- code =
- afs_GetOnePage(vp, off, len, protp, pl, plsz, seg, addr, rw,
- acred);
-#else
if (len <= PAGESIZE)
code =
- afs_GetOnePage(vp, (u_int) off, len, protp, pl, plsz, seg, addr,
- rw, acred);
+ afs_GetOnePage(vp,
+#if !defined(AFS_SUN56_ENV)
+ (u_int)
#endif
+ off, len, protp, pl, plsz, seg, addr, rw, acred);
else {
struct vcache *vcp = VTOAFS(vp);
ObtainWriteLock(&vcp->vlock, 548);
vcp->multiPage++;
ReleaseWriteLock(&vcp->vlock);
afs_BozonLock(&vcp->pvnLock, vcp);
-#if defined(AFS_SUN56_ENV)
- code =
- pvn_getpages(afs_GetOnePage, vp, off, len, protp, pl, plsz, seg,
- addr, rw, acred);
-#else
code =
- pvn_getpages(afs_GetOnePage, vp, (u_int) off, len, protp, pl,
- plsz, seg, addr, rw, acred);
+ pvn_getpages(afs_GetOnePage, vp,
+#if !defined(AFS_SUN56_ENV)
+ (u_int)
#endif
+ off, len, protp, pl, plsz, seg, addr, rw, acred);
afs_BozonUnlock(&vcp->pvnLock, vcp);
ObtainWriteLock(&vcp->vlock, 549);
vcp->multiPage--;
/* Return all the pages from [off..off+len) in file */
int
-afs_GetOnePage(vp, off, alen, protp, pl, plsz, seg, addr, rw, acred)
- u_int alen;
- struct vnode *vp;
#if defined(AFS_SUN56_ENV)
- u_offset_t off;
+afs_GetOnePage(struct vnode *vp, u_offset_t off, u_int alen, u_int *protp,
+ struct page *pl[], u_int plsz, struct seg *seg, caddr_t addr,
+ enum seg_rw rw, AFS_UCRED *acred)
#else
- u_int off;
+afs_GetOnePage(struct vnode *vp, u_int off, u_int alen, u_int *protp,
+ struct page *pl[], u_int plsz, struct seg *seg, caddr_t addr,
+ enum seg_rw rw, AFS_UCRED *acred)
#endif
- u_int *protp;
- struct page *pl[];
- u_int plsz;
- struct seg *seg;
- caddr_t addr;
- enum seg_rw rw;
- struct AFS_UCRED *acred;
{
register struct page *page;
register afs_int32 code = 0;
register struct dcache *tdc;
int i, s, pexists;
int slot;
- afs_size_t offset = 0, nlen;
+ afs_size_t offset, nlen = 0;
struct vrequest treq;
afs_int32 mapForRead = 0, Code = 0;
u_offset_t toffset;
else
tdc = afs_GetDCache(avc, (afs_offs_t) off, &treq, &offset, &nlen, 1);
if (!tdc)
- return EINVAL;
+ return afs_CheckCode(EINVAL, &treq, 62);
code = afs_VerifyVCache(avc, &treq);
if (code) {
afs_PutDCache(tdc);
ObtainReadLock(&tdc->lock);
/* Check to see whether the cache entry is still valid */
- if (!(avc->states & CStatd)
- || !hsame(avc->m.DataVersion, tdc->f.versionNo)) {
+ if (!(avc->f.states & CStatd)
+ || !hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
ReleaseReadLock(&tdc->lock);
ReleaseReadLock(&avc->lock);
afs_BozonUnlock(&avc->pvnLock, avc);
buf = pageio_setup(page, PAGESIZE, vp, B_READ); /* allocate a buf structure */
buf->b_edev = 0;
buf->b_dev = 0;
+#if defined(AFS_SUN56_ENV)
+ buf->b_lblkno = lbtodb(toffset);
+#else
buf->b_blkno = btodb(toffset);
+#endif
bp_mapin(buf); /* map it in to our address space */
AFS_GLOCK();
}
int
-afs_putpage(vp, off, len, flags, cred)
- struct vnode *vp;
- offset_t off;
- u_int len;
- int flags;
- struct AFS_UCRED *cred;
+afs_putpage(struct vnode *vp, offset_t off, u_int len, int flags,
+ AFS_UCRED *cred)
{
struct vcache *avc;
struct page *pages;
if (len) {
endPos = (afs_offs_t) off + len; /* position we're supposed to write up to */
while ((afs_offs_t) toff < endPos
- && (afs_offs_t) toff < avc->m.Length) {
+ && (afs_offs_t) toff < avc->f.m.Length) {
/* If not invalidating pages use page_lookup_nowait to avoid reclaiming
* them from the free list
*/
int
-afs_putapage(struct vnode *vp, struct page *pages,
-#if defined(AFS_SUN56_ENV)
- u_offset_t * offp,
+#if defined(AFS_SUN58_ENV)
+afs_putapage(struct vnode *vp, struct page *pages, u_offset_t * offp,
+ size_t * lenp, int flags, AFS_UCRED *credp)
+#elif defined(AFS_SUN56_ENV)
+afs_putapage(struct vnode *vp, struct page *pages, u_offset_t * offp,
+ u_int * lenp, int flags, AFS_UCRED *credp)
#else
- u_int * offp,
+afs_putapage(struct vnode *vp, struct page *pages, u_int * offp,
+ u_int * lenp, int flags, AFS_UCRED *credp)
#endif
-#if defined(AFS_SUN58_ENV)
- size_t * lenp,
-#else
- u_int * lenp,
-#endif
- int flags, struct AFS_UCRED *credp)
{
struct buf *tbuf;
struct vcache *avc = VTOAFS(vp);
* XXX Find a kluster that fits in one block (or page). We also
* adjust the i/o if the file space is less than a while page. XXX
*/
- if (off + tlen > avc->m.Length) {
- tlen = avc->m.Length - off;
+ if (off + tlen > avc->f.m.Length) {
+ tlen = avc->f.m.Length - off;
}
/* can't call mapout with 0 length buffers (rmfree panics) */
if (((tlen >> 24) & 0xff) == 0xff) {
return (ENOMEM);
tbuf->b_dev = 0;
+#if defined(AFS_SUN56_ENV)
+ tbuf->b_lblkno = lbtodb(pages->p_offset);
+#else
tbuf->b_blkno = btodb(pages->p_offset);
+#endif
bp_mapin(tbuf);
AFS_GLOCK();
afs_Trace4(afs_iclSetp, CM_TRACE_PAGEOUTONE, ICL_TYPE_LONG, avc,
}
int
-afs_nfsrdwr(avc, auio, arw, ioflag, acred)
- register struct vcache *avc;
- struct uio *auio;
- enum uio_rw arw;
- int ioflag;
- struct AFS_UCRED *acred;
+afs_nfsrdwr(register struct vcache *avc, struct uio *auio, enum uio_rw arw,
+ int ioflag, AFS_UCRED *acred)
{
register afs_int32 code;
afs_int32 code2;
afs_Trace4(afs_iclSetp, CM_TRACE_VMRW, ICL_TYPE_POINTER, (afs_int32) avc,
ICL_TYPE_LONG, (arw == UIO_WRITE ? 1 : 0), ICL_TYPE_OFFSET,
- ICL_HANDLE_OFFSET(auio->uio_offset), ICL_TYPE_OFFSET,
+ ICL_HANDLE_OFFSET(auio->uio_loffset), ICL_TYPE_OFFSET,
ICL_HANDLE_OFFSET(auio->uio_resid));
#ifndef AFS_64BIT_CLIENT
/* adjust parameters when appending files */
if ((ioflag & IO_APPEND) && arw == UIO_WRITE) {
-#if defined(AFS_SUN56_ENV)
- auio->uio_loffset = 0;
+#if defined(AFS_SUN56_ENV)
+ auio->uio_loffset = avc->f.m.Length; /* write at EOF position */
+#else
+ auio->uio_offset = avc->f.m.Length; /* write at EOF position */
#endif
- auio->uio_offset = avc->m.Length; /* write at EOF position */
}
- if (auio->uio_offset < 0 || (auio->uio_offset + auio->uio_resid) < 0) {
+ if (auio->afsio_offset < 0 || (auio->afsio_offset + auio->uio_resid) < 0) {
ReleaseWriteLock(&avc->lock);
afs_BozonUnlock(&avc->pvnLock, avc);
return EINVAL;
* to hold the results (since afs_putpage will be called to force the I/O */
size = auio->afsio_resid + auio->afsio_offset; /* new file size */
appendLength = size;
- origLength = avc->m.Length;
- if (size > avc->m.Length) {
+ origLength = avc->f.m.Length;
+ if (size > avc->f.m.Length) {
afs_Trace4(afs_iclSetp, CM_TRACE_SETLENGTH, ICL_TYPE_STRING,
__FILE__, ICL_TYPE_LONG, __LINE__, ICL_TYPE_OFFSET,
- ICL_HANDLE_OFFSET(avc->m.Length), ICL_TYPE_OFFSET,
+ ICL_HANDLE_OFFSET(avc->f.m.Length), ICL_TYPE_OFFSET,
ICL_HANDLE_OFFSET(size));
- avc->m.Length = size; /* file grew */
+ avc->f.m.Length = size; /* file grew */
}
- avc->states |= CDirty; /* Set the dirty bit */
- avc->m.Date = osi_Time(); /* Set file date (for ranlib) */
+ avc->f.states |= CDirty; /* Set the dirty bit */
+ avc->f.m.Date = osi_Time(); /* Set file date (for ranlib) */
} else {
mode = S_READ; /* map-in read-only */
- origLength = avc->m.Length;
+ origLength = avc->f.m.Length;
}
if (acred && AFS_NFSXLATORREQ(acred)) {
* call it with an offset based on blocks smaller than MAXBSIZE
* (implying that it should be named BSIZE, since it is clearly both a
* max and a min). */
- size = auio->afsio_resid; /* transfer size */
- fileBase = auio->afsio_offset; /* start file position for xfr */
+ size = auio->afsio_resid; /* transfer size */
+ fileBase = ((arw == UIO_READ) && (origLength < auio->uio_offset)) ?
+ origLength : auio->afsio_offset; /* start file position for xfr */
pageBase = fileBase & ~(MAXBSIZE - 1); /* file position of the page */
pageOffset = fileBase & (MAXBSIZE - 1); /* xfr start's offset within page */
tsize = MAXBSIZE - pageOffset; /* how much more fits in this page */
break; /* nothing to transfer, we're done */
}
if (arw == UIO_WRITE)
- avc->states |= CDirty; /* may have been cleared by DoPartialWrite */
+ avc->f.states |= CDirty; /* may have been cleared by DoPartialWrite */
/* Before dropping lock, hold the chunk (create it if necessary). This
* serves two purposes: (1) Ensure Cache Truncate Daemon doesn't try
AFS_GLOCK();
dcp_newpage = afs_FindDCache(avc, pageBase);
if (dcp_newpage
- && hsame(avc->m.DataVersion, dcp_newpage->f.versionNo)) {
+ && hsame(avc->f.m.DataVersion, dcp_newpage->f.versionNo)) {
ObtainWriteLock(&avc->lock, 251);
ObtainWriteLock(&avc->vlock, 576);
ObtainReadLock(&dcp_newpage->lock);
if ((avc->activeV == 0)
- && hsame(avc->m.DataVersion, dcp_newpage->f.versionNo)
+ && hsame(avc->f.m.DataVersion, dcp_newpage->f.versionNo)
&& !(dcp_newpage->dflags & (DFFetching))) {
AFS_GUNLOCK();
segmap_pagecreate(segkmap, raddr, rsize, 1);
if (didFakeOpen) {
afs_FakeClose(avc, acred);
}
- if (arw == UIO_WRITE && (avc->states & CDirty)) {
+ if (arw == UIO_WRITE && (avc->f.states & CDirty)) {
code2 = afs_DoPartialWrite(avc, &treq);
if (!code)
code = code2;
return afs_CheckCode(code, &treq, 46);
}
-afs_map(vp, off, as, addr, len, prot, maxprot, flags, cred)
- struct vnode *vp;
- struct as *as;
- offset_t off;
- caddr_t *addr;
- u_int len;
- u_char prot, maxprot;
- u_int flags;
- struct AFS_UCRED *cred;
+int
+afs_map(struct vnode *vp, offset_t off, struct as *as, caddr_t *addr, u_int len, u_char prot, u_char maxprot, u_int flags, AFS_UCRED *cred)
{
struct segvn_crargs crargs;
register afs_int32 code;
}
afs_BozonLock(&avc->pvnLock, avc);
osi_FlushPages(avc, cred); /* ensure old pages are gone */
- avc->states |= CMAPPED; /* flag cleared at afs_inactive */
+ avc->f.states |= CMAPPED; /* flag cleared at afs_inactive */
afs_BozonUnlock(&avc->pvnLock, avc);
AFS_GUNLOCK();
* For Now We use standard local kernel params for AFS system values. Change this
* at some point.
*/
-afs_pathconf(vp, cmd, outdatap, credp)
- register struct AFS_UCRED *credp;
- struct vnode *vp;
- int cmd;
- u_long *outdatap;
+int
+#ifdef AFS_SUN511_ENV
+afs_pathconf(struct vnode *vp, int cmd, u_long *outdatap,
+ register AFS_UCRED *credp, caller_context_t *ct)
+#else
+afs_pathconf(struct vnode *vp, int cmd, u_long *outdatap,
+ register AFS_UCRED *credp)
+#endif /* AFS_SUN511_ENV */
{
AFS_STATCNT(afs_cntl);
switch (cmd) {
case _PC_NO_TRUNC:
*outdatap = 1;
break;
+ case _PC_FILESIZEBITS:
+#ifdef AFS_64BIT_CLIENT
+ *outdatap = 64;
+#else
+ *outdatap = 32;
+#endif
+ break;
default:
- return EINVAL;
+#ifdef AFS_SUN511_ENV
+ return fs_pathconf(vp, cmd, outdatap, credp, ct);
+#else
+ return fs_pathconf(vp, cmd, outdatap, credp);
+#endif /* AFS_SUN511_ENV */
}
return 0;
}
-afs_ioctl(vnp, com, arg, flag, credp, rvalp)
- struct vnode *vnp;
- int com, arg, flag;
- cred_t *credp;
- int *rvalp;
+int
+afs_ioctl(struct vnode *vnp, int com, int arg, int flag, cred_t *credp,
+ int *rvalp)
{
return (ENOTTY);
}
void
-afs_rwlock(vnp, wlock)
- struct vnode *vnp;
- int wlock;
+afs_rwlock(struct vnode *vnp, int wlock)
{
rw_enter(&(VTOAFS(vnp))->rwlock, (wlock ? RW_WRITER : RW_READER));
}
void
-afs_rwunlock(vnp, wlock)
- struct vnode *vnp;
- int wlock;
+afs_rwunlock(struct vnode *vnp, int wlock)
{
rw_exit(&(VTOAFS(vnp))->rwlock);
}
/* NOT SUPPORTED */
-afs_seek(vnp, ooff, noffp)
- struct vnode *vnp;
- offset_t ooff;
- offset_t *noffp;
+int
+afs_seek(struct vnode *vnp, offset_t ooff, offset_t *noffp)
{
register int code = 0;
- if ((*noffp < 0 || *noffp > MAXOFF_T))
+#ifndef AFS_64BIT_CLIENT
+# define __MAXOFF_T MAXOFF_T
+#else
+# define __MAXOFF_T MAXOFFSET_T
+#endif
+
+ if ((*noffp < 0 || *noffp > __MAXOFF_T))
code = EINVAL;
return code;
}
int
-afs_frlock(vnp, cmd, ap, flag, off,
#ifdef AFS_SUN59_ENV
- flkcb,
-#endif
- credp)
- struct vnode *vnp;
- int cmd;
-#if defined(AFS_SUN56_ENV)
- struct flock64 *ap;
+afs_frlock(struct vnode *vnp, int cmd, struct flock64 *ap, int flag,
+ offset_t off, struct flk_callback *flkcb, AFS_UCRED *credp)
+#elif defined(AFS_SUN56_ENV)
+afs_frlock(struct vnode *vnp, int cmd, struct flock64 *ap, int flag,
+ offset_t off, AFS_UCRED *credp)
#else
- struct flock *ap;
-#endif
- int flag;
- offset_t off;
-#ifdef AFS_SUN59_ENV
- struct flk_callback *flkcb;
+afs_frlock(struct vnode *vnp, int cmd, struct flock *ap, int flag,
+ offset_t off, AFS_UCRED *credp)
#endif
- struct AFS_UCRED *credp;
{
register afs_int32 code = 0;
/*
int
-afs_space(vnp, cmd, ap, flag, off, credp)
- struct vnode *vnp;
- int cmd;
#if defined(AFS_SUN56_ENV)
- struct flock64 *ap;
+afs_space(struct vnode *vnp, int cmd, struct flock64 *ap, int flag,
+ offset_t off, AFS_UCRED *credp)
#else
- struct flock *ap;
+afs_space(struct vnode *vnp, int cmd, struct flock *ap, int flag,
+ offset_t off, AFS_UCRED *credp)
#endif
- int flag;
- offset_t off;
- struct AFS_UCRED *credp;
{
register afs_int32 code = EINVAL;
struct vattr vattr;
}
int
-afs_dump(vp, addr, i1, i2)
- struct vnode *vp;
- caddr_t addr;
- int i1, i2;
+afs_dump(struct vnode *vp, caddr_t addr, int i1, int i2)
{
AFS_STATCNT(afs_dump);
afs_warn("AFS_DUMP. MUST IMPLEMENT THIS!!!\n");
/* Nothing fancy here; just compare if vnodes are identical ones */
-afs_cmp(vp1, vp2)
- struct vnode *vp1, *vp2;
+int
+afs_cmp(struct vnode *vp1, struct vnode *vp2)
{
AFS_STATCNT(afs_cmp);
return (vp1 == vp2);
int
-afs_pageio(vp, pp, ui1, ui2, i1, credp)
- struct vnode *vp;
- struct page *pp;
- u_int ui1, ui2;
- int i1;
- struct cred *credp;
+afs_pageio(struct vnode *vp, struct page *pp, u_int ui1, u_int ui2, int i1,
+ struct cred *credp)
{
afs_warn("afs_pageio: Not implemented\n");
return EINVAL;
}
int
-afs_dumpctl(vp, i
-#ifdef AFS_SUN59_ENV
- , blkp
-#endif
- )
- struct vnode *vp;
- int i;
#ifdef AFS_SUN59_ENV
- int *blkp;
+afs_dumpctl(struct vnode *vp, int i, int *blkp)
+#else
+afs_dumpctl(struct vnode *vp, int i)
#endif
{
afs_warn("afs_dumpctl: Not implemented\n");
}
#ifdef AFS_SUN54_ENV
+#ifdef AFS_SUN511_ENV
+extern void
+afs_dispose(struct vnode *vp, struct page *p, int fl, int dn, struct cred *cr, struct caller_context_t *ct)
+{
+ fs_dispose(vp, p, fl, dn, cr,ct);
+}
+
+int
+afs_setsecattr(struct vnode *vp, vsecattr_t *vsecattr, int flag, struct cred *creds, struct caller_context_t *ct)
+{
+ return ENOSYS;
+}
+
+int
+afs_getsecattr(struct vnode *vp, vsecattr_t *vsecattr, int flag, struct cred *creds, struct caller_context_t *ct)
+{
+ return fs_fab_acl(vp, vsecattr, flag, creds,ct);
+}
+#else
extern void
-afs_dispose(vp, p, fl, dn, cr)
- struct vnode *vp;
- struct page *p;
- int fl, dn;
- struct cred *cr;
+afs_dispose(struct vnode *vp, struct page *p, int fl, int dn, struct cred *cr)
{
fs_dispose(vp, p, fl, dn, cr);
}
int
-afs_setsecattr(vp, vsecattr, flag, creds)
- struct vnode *vp;
- vsecattr_t *vsecattr;
- int flag;
- struct cred *creds;
+afs_setsecattr(struct vnode *vp, vsecattr_t *vsecattr, int flag,
+ struct cred *creds)
{
return ENOSYS;
}
int
-afs_getsecattr(vp, vsecattr, flag, creds)
- struct vnode *vp;
- vsecattr_t *vsecattr;
- int flag;
- struct cred *creds;
+afs_getsecattr(struct vnode *vp, vsecattr_t *vsecattr, int flag, struct cred *creds)
{
return fs_fab_acl(vp, vsecattr, flag, creds);
}
#endif
+#endif
#ifdef AFS_GLOBAL_SUNLOCK
-extern int gafs_open(), gafs_close(), afs_ioctl(), gafs_access();
-extern int gafs_getattr(), gafs_setattr(), gafs_lookup(), gafs_create();
-extern int gafs_remove(), gafs_link(), gafs_rename(), gafs_mkdir();
-extern int gafs_rmdir(), gafs_readdir(), gafs_fsync(), gafs_symlink();
-extern int gafs_fid(), gafs_readlink(), fs_setfl(), afs_pathconf();
-extern int afs_lockctl();
-extern void gafs_inactive();
-
-#ifdef AFS_SUN510_ENV
-struct fs_operation_def afs_vnodeops_template[] = {
- { VOPNAME_OPEN, gafs_open },
- { VOPNAME_CLOSE, gafs_close },
- { VOPNAME_READ, afs_vmread },
- { VOPNAME_WRITE, afs_vmwrite },
- { VOPNAME_IOCTL, afs_ioctl },
- { VOPNAME_SETFL, fs_setfl },
- { VOPNAME_GETATTR, gafs_getattr },
- { VOPNAME_SETATTR, gafs_setattr },
- { VOPNAME_ACCESS, gafs_access },
- { VOPNAME_LOOKUP, gafs_lookup },
- { VOPNAME_CREATE, gafs_create },
- { VOPNAME_REMOVE, gafs_remove },
- { VOPNAME_LINK, gafs_link },
- { VOPNAME_RENAME, gafs_rename },
- { VOPNAME_MKDIR, gafs_mkdir },
- { VOPNAME_RMDIR, gafs_rmdir },
- { VOPNAME_READDIR, gafs_readdir },
- { VOPNAME_SYMLINK, gafs_symlink },
- { VOPNAME_READLINK, gafs_readlink },
- { VOPNAME_FSYNC, gafs_fsync },
- { VOPNAME_INACTIVE, gafs_inactive },
- { VOPNAME_FID, gafs_fid },
- { VOPNAME_RWLOCK, afs_rwlock },
- { VOPNAME_RWUNLOCK, afs_rwunlock },
- { VOPNAME_SEEK, afs_seek },
- { VOPNAME_CMP, afs_cmp },
- { VOPNAME_FRLOCK, afs_frlock },
- { VOPNAME_SPACE, afs_space },
- { VOPNAME_REALVP, afs_realvp },
- { VOPNAME_GETPAGE, afs_getpage },
- { VOPNAME_PUTPAGE, afs_putpage },
- { VOPNAME_MAP, afs_map },
- { VOPNAME_ADDMAP, afs_addmap },
- { VOPNAME_DELMAP, afs_delmap },
- { VOPNAME_POLL, fs_poll },
- { VOPNAME_DUMP, afs_dump },
- { VOPNAME_PATHCONF, afs_pathconf },
- { VOPNAME_PAGEIO, afs_pageio },
- { VOPNAME_DUMPCTL, afs_dumpctl },
- { VOPNAME_DISPOSE, afs_dispose },
- { VOPNAME_GETSECATTR, afs_getsecattr },
- { VOPNAME_SETSECATTR, afs_setsecattr },
- { VOPNAME_SHRLOCK, fs_shrlock },
- NULL,
+extern int gafs_open(register struct vcache **avcp, afs_int32 aflags,
+ AFS_UCRED *acred);
+extern int gafs_close(register struct vcache *avc, afs_int32 aflags,
+ int count, offset_t offset, AFS_UCRED *acred);
+extern int afs_ioctl(struct vnode *vnp, int com, int arg, int flag,
+ cred_t *credp, int *rvalp);
+extern int gafs_access(register struct vcache *avc, register afs_int32 amode,
+ int flags, AFS_UCRED *acred);
+extern int gafs_getattr(register struct vcache *avc,
+ register struct vattr *attrs, int flags,
+ AFS_UCRED *acred);
+extern int gafs_setattr(register struct vcache *avc,
+ register struct vattr *attrs, int flags,
+ AFS_UCRED *acred);
+extern int gafs_lookup(register struct vcache *adp, char *aname,
+ register struct vcache **avcp, struct pathname *pnp,
+ int flags, struct vnode *rdir, AFS_UCRED *acred);
+extern int gafs_remove(register struct vcache *adp, char *aname,
+ AFS_UCRED *acred);
+extern int gafs_link(register struct vcache *adp, register struct vcache *avc,
+ char *aname, AFS_UCRED *acred);
+extern int gafs_rename(register struct vcache *aodp, char *aname1,
+ register struct vcache *andp, char *aname2,
+ AFS_UCRED *acred);
+extern int gafs_symlink(register struct vcache *adp, char *aname,
+ struct vattr *attrs, register char *atargetName,
+ AFS_UCRED *acred);
+extern int gafs_rmdir(register struct vcache *adp, char *aname,
+ struct vnode *cdirp, AFS_UCRED *acred);
+extern int gafs_mkdir(register struct vcache *adp, char *aname,
+ struct vattr *attrs, register struct vcache **avcp,
+ AFS_UCRED *acred);
+extern int
+#ifdef AFS_SUN53_ENV
+gafs_fsync(register struct vcache *avc, int flag, AFS_UCRED *acred);
+#else
+gafs_fsync(register struct vcache *avc, AFS_UCRED *acred);
+#endif
+extern int gafs_readlink(register struct vcache *avc, struct uio *auio,
+ AFS_UCRED *acred);
+extern int gafs_readdir(register struct vcache *avc, struct uio *auio,
+ AFS_UCRED *acred, int *eofp);
+extern void gafs_inactive(register struct vcache *avc,
+ AFS_UCRED *acred);
+extern int gafs_fid(struct vcache *avc, struct fid **fidpp);
+extern int gafs_create(register struct vcache *adp, char *aname,
+ struct vattr *attrs, enum vcexcl aexcl, int amode,
+ struct vcache **avcp, AFS_UCRED *acred);
+#ifdef AFS_SUN511_ENV
+extern int afs_pathconf(struct vnode *vp, int cmd, u_long *outdatap,
+ register AFS_UCRED *credp, caller_context_t *ct);
+#else
+extern int afs_pathconf(struct vnode *vp, int cmd, u_long *outdatap,
+ register AFS_UCRED *credp);
+#endif /* AFS_SUN511_ENV */
+
+#if defined(AFS_SUN511_ENV)
+/* The following list must always be NULL-terminated */
+const fs_operation_def_t afs_vnodeops_template[] = {
+ VOPNAME_OPEN, { .vop_open = gafs_open },
+ VOPNAME_CLOSE, { .vop_close = gafs_close },
+ VOPNAME_READ, { .vop_read = afs_vmread },
+ VOPNAME_WRITE, { .vop_write = afs_vmwrite },
+ VOPNAME_IOCTL, { .vop_ioctl = afs_ioctl },
+ VOPNAME_SETFL, { .vop_setfl = fs_setfl },
+ VOPNAME_GETATTR, { .vop_getattr = gafs_getattr },
+ VOPNAME_SETATTR, { .vop_setattr = gafs_setattr },
+ VOPNAME_ACCESS, { .vop_access = gafs_access },
+ VOPNAME_LOOKUP, { .vop_lookup = gafs_lookup },
+ VOPNAME_CREATE, { .vop_create = gafs_create },
+ VOPNAME_REMOVE, { .vop_remove = gafs_remove },
+ VOPNAME_LINK, { .vop_link = gafs_link },
+ VOPNAME_RENAME, { .vop_rename = gafs_rename },
+ VOPNAME_MKDIR, { .vop_mkdir = gafs_mkdir },
+ VOPNAME_RMDIR, { .vop_rmdir = gafs_rmdir },
+ VOPNAME_READDIR, { .vop_readdir = gafs_readdir },
+ VOPNAME_SYMLINK, { .vop_symlink = gafs_symlink },
+ VOPNAME_READLINK, { .vop_readlink = gafs_readlink },
+ VOPNAME_FSYNC, { .vop_fsync = gafs_fsync },
+ VOPNAME_INACTIVE, { .vop_inactive = gafs_inactive },
+ VOPNAME_FID, { .vop_fid = gafs_fid },
+ VOPNAME_RWLOCK, { .vop_rwlock = afs_rwlock },
+ VOPNAME_RWUNLOCK, { .vop_rwunlock = afs_rwunlock },
+ VOPNAME_SEEK, { .vop_seek = afs_seek },
+ VOPNAME_CMP, { .vop_cmp = afs_cmp },
+ VOPNAME_FRLOCK, { .vop_frlock = afs_frlock },
+ VOPNAME_SPACE, { .vop_space = afs_space },
+ VOPNAME_REALVP, { .vop_realvp = afs_realvp },
+ VOPNAME_GETPAGE, { .vop_getpage = afs_getpage },
+ VOPNAME_PUTPAGE, { .vop_putpage = afs_putpage },
+ VOPNAME_MAP, { .vop_map = afs_map },
+ VOPNAME_ADDMAP, { .vop_addmap = afs_addmap },
+ VOPNAME_DELMAP, { .vop_delmap = afs_delmap },
+ VOPNAME_POLL, { .vop_poll = fs_poll },
+ VOPNAME_PATHCONF, { .vop_pathconf = afs_pathconf },
+ VOPNAME_PAGEIO, { .vop_pageio = afs_pageio },
+ VOPNAME_DUMP, { .vop_dump = afs_dump },
+ VOPNAME_DUMPCTL, { .vop_dumpctl = afs_dumpctl },
+ VOPNAME_DISPOSE, { .vop_dispose = afs_dispose },
+ VOPNAME_GETSECATTR, { .vop_getsecattr = afs_getsecattr },
+ VOPNAME_SETSECATTR, { .vop_setsecattr = afs_setsecattr },
+ VOPNAME_SHRLOCK, { .vop_shrlock = fs_shrlock },
+ NULL, NULL
+};
+vnodeops_t *afs_ops;
+#elif defined(AFS_SUN510_ENV)
+/* The following list must always be NULL-terminated */
+const fs_operation_def_t afs_vnodeops_template[] = {
+ VOPNAME_OPEN, gafs_open,
+ VOPNAME_CLOSE, gafs_close,
+ VOPNAME_READ, afs_vmread,
+ VOPNAME_WRITE, afs_vmwrite,
+ VOPNAME_IOCTL, afs_ioctl,
+ VOPNAME_SETFL, fs_setfl,
+ VOPNAME_GETATTR, gafs_getattr,
+ VOPNAME_SETATTR, gafs_setattr,
+ VOPNAME_ACCESS, gafs_access,
+ VOPNAME_LOOKUP, gafs_lookup,
+ VOPNAME_CREATE, gafs_create,
+ VOPNAME_REMOVE, gafs_remove,
+ VOPNAME_LINK, gafs_link,
+ VOPNAME_RENAME, gafs_rename,
+ VOPNAME_MKDIR, gafs_mkdir,
+ VOPNAME_RMDIR, gafs_rmdir,
+ VOPNAME_READDIR, gafs_readdir,
+ VOPNAME_SYMLINK, gafs_symlink,
+ VOPNAME_READLINK, gafs_readlink,
+ VOPNAME_FSYNC, gafs_fsync,
+ VOPNAME_INACTIVE, gafs_inactive,
+ VOPNAME_FID, gafs_fid,
+ VOPNAME_RWLOCK, afs_rwlock,
+ VOPNAME_RWUNLOCK, afs_rwunlock,
+ VOPNAME_SEEK, afs_seek,
+ VOPNAME_CMP, afs_cmp,
+ VOPNAME_FRLOCK, afs_frlock,
+ VOPNAME_SPACE, afs_space,
+ VOPNAME_REALVP, afs_realvp,
+ VOPNAME_GETPAGE, afs_getpage,
+ VOPNAME_PUTPAGE, afs_putpage,
+ VOPNAME_MAP, afs_map,
+ VOPNAME_ADDMAP, afs_addmap,
+ VOPNAME_DELMAP, afs_delmap,
+ VOPNAME_POLL, fs_poll,
+ VOPNAME_DUMP, afs_dump,
+ VOPNAME_PATHCONF, afs_pathconf,
+ VOPNAME_PAGEIO, afs_pageio,
+ VOPNAME_DUMPCTL, afs_dumpctl,
+ VOPNAME_DISPOSE, afs_dispose,
+ VOPNAME_GETSECATTR, afs_getsecattr,
+ VOPNAME_SETSECATTR, afs_setsecattr,
+ VOPNAME_SHRLOCK, fs_shrlock,
+ NULL, NULL
};
struct vnodeops *afs_ops;
#else
struct vnodeops *afs_ops = &Afs_vnodeops;
#endif
-
-
-gafs_open(avcp, aflags, acred)
- register struct vcache **avcp;
- afs_int32 aflags;
- struct AFS_UCRED *acred;
+int
+gafs_open(register struct vcache **avcp, afs_int32 aflags,
+ AFS_UCRED *acred)
{
register int code;
return (code);
}
-
-gafs_close(avc, aflags, count, offset, acred)
- offset_t offset;
- int count;
- register struct vcache *avc;
- afs_int32 aflags;
- struct AFS_UCRED *acred;
+int
+gafs_close(register struct vcache *avc, afs_int32 aflags, int count,
+ offset_t offset, AFS_UCRED *acred)
{
register int code;
return (code);
}
-
-gafs_getattr(avc, attrs, flags, acred)
- int flags;
- register struct vcache *avc;
- register struct vattr *attrs;
- struct AFS_UCRED *acred;
+int
+gafs_getattr(register struct vcache *avc, register struct vattr *attrs,
+ int flags, AFS_UCRED *acred)
{
register int code;
}
-gafs_setattr(avc, attrs, flags, acred)
- int flags;
- register struct vcache *avc;
- register struct vattr *attrs;
- struct AFS_UCRED *acred;
+int
+gafs_setattr(register struct vcache *avc, register struct vattr *attrs,
+ int flags, AFS_UCRED *acred)
{
register int code;
}
-gafs_access(avc, amode, flags, acred)
- int flags;
- register struct vcache *avc;
- register afs_int32 amode;
- struct AFS_UCRED *acred;
+int
+gafs_access(register struct vcache *avc, register afs_int32 amode, int flags,
+ AFS_UCRED *acred)
{
register int code;
}
-gafs_lookup(adp, aname, avcp, pnp, flags, rdir, acred)
- struct pathname *pnp;
- int flags;
- struct vnode *rdir;
- register struct vcache *adp, **avcp;
- char *aname;
- struct AFS_UCRED *acred;
+int
+gafs_lookup(register struct vcache *adp, char *aname,
+ register struct vcache **avcp, struct pathname *pnp, int flags,
+ struct vnode *rdir, AFS_UCRED *acred)
{
register int code;
}
-gafs_create(adp, aname, attrs, aexcl, amode, avcp, acred)
- register struct vcache *adp;
- char *aname;
- struct vattr *attrs;
- enum vcexcl aexcl;
- int amode;
- struct vcache **avcp;
- struct AFS_UCRED *acred;
+int
+gafs_create(register struct vcache *adp, char *aname, struct vattr *attrs,
+ enum vcexcl aexcl, int amode, struct vcache **avcp,
+ AFS_UCRED *acred)
{
register int code;
return (code);
}
-gafs_remove(adp, aname, acred)
- register struct vcache *adp;
- char *aname;
- struct AFS_UCRED *acred;
+int
+gafs_remove(register struct vcache *adp, char *aname, AFS_UCRED *acred)
{
register int code;
return (code);
}
-gafs_link(adp, avc, aname, acred)
- register struct vcache *avc;
- register struct vcache *adp;
- char *aname;
- struct AFS_UCRED *acred;
+int
+gafs_link(register struct vcache *adp, register struct vcache *avc,
+ char *aname, AFS_UCRED *acred)
{
register int code;
return (code);
}
-gafs_rename(aodp, aname1, andp, aname2, acred)
- register struct vcache *aodp, *andp;
- char *aname1, *aname2;
- struct AFS_UCRED *acred;
+int
+gafs_rename(register struct vcache *aodp, char *aname1,
+ register struct vcache *andp, char *aname2,
+ AFS_UCRED *acred)
{
register int code;
AFS_GLOCK();
code = afs_rename(aodp, aname1, andp, aname2, acred);
+#ifdef AFS_SUN510_ENV
+ if (code == 0) {
+ struct vcache *avcp = NULL;
+
+ (void) afs_lookup(andp, aname2, &avcp, NULL, 0, NULL, acred);
+ if (avcp) {
+ struct vnode *vp = AFSTOV(avcp), *pvp = AFSTOV(andp);
+
+ mutex_enter(&vp->v_lock);
+ if (vp->v_path != NULL) {
+ kmem_free(vp->v_path, strlen(vp->v_path) + 1);
+ vp->v_path = NULL;
+ }
+ mutex_exit(&vp->v_lock);
+ vn_setpath(afs_globalVp, pvp, vp, aname2, strlen(aname2));
+
+ AFS_RELE(avcp);
+ }
+ }
+#endif
AFS_GUNLOCK();
return (code);
}
-gafs_mkdir(adp, aname, attrs, avcp, acred)
- register struct vcache *adp;
- register struct vcache **avcp;
- char *aname;
- struct vattr *attrs;
- struct AFS_UCRED *acred;
+int
+gafs_mkdir(register struct vcache *adp, char *aname, struct vattr *attrs,
+ register struct vcache **avcp, AFS_UCRED *acred)
{
register int code;
return (code);
}
-
-gafs_rmdir(adp, aname, cdirp, acred)
- struct vnode *cdirp;
- register struct vcache *adp;
- char *aname;
- struct AFS_UCRED *acred;
+int
+gafs_rmdir(register struct vcache *adp, char *aname, struct vnode *cdirp,
+ AFS_UCRED *acred)
{
register int code;
}
-gafs_readdir(avc, auio, acred, eofp)
- int *eofp;
- register struct vcache *avc;
- struct uio *auio;
- struct AFS_UCRED *acred;
+int
+gafs_readdir(register struct vcache *avc, struct uio *auio,
+ AFS_UCRED *acred, int *eofp)
{
register int code;
return (code);
}
-gafs_symlink(adp, aname, attrs, atargetName, acred)
- register struct vcache *adp;
- register char *atargetName;
- char *aname;
- struct vattr *attrs;
- struct AFS_UCRED *acred;
+int
+gafs_symlink(register struct vcache *adp, char *aname, struct vattr *attrs,
+ register char *atargetName, AFS_UCRED *acred)
{
register int code;
}
-gafs_readlink(avc, auio, acred)
- register struct vcache *avc;
- struct uio *auio;
- struct AFS_UCRED *acred;
+int
+gafs_readlink(register struct vcache *avc, struct uio *auio, AFS_UCRED *acred)
{
register int code;
return (code);
}
+int
#ifdef AFS_SUN53_ENV
-gafs_fsync(avc, flag, acred)
- int flag;
+gafs_fsync(register struct vcache *avc, int flag, AFS_UCRED *acred)
#else
-gafs_fsync(avc, acred)
+gafs_fsync(register struct vcache *avc, AFS_UCRED *acred)
#endif
- register struct vcache *avc;
- struct AFS_UCRED *acred;
{
register int code;
return (code);
}
-void
-afs_inactive(struct vcache *avc, struct AFS_UCRED *acred)
+int
+afs_inactive(struct vcache *avc, AFS_UCRED *acred)
{
struct vnode *vp = AFSTOV(avc);
if (afs_shuttingdown)
- return;
+ return 0;
/*
* In Solaris and HPUX s800 and HP-UX10.0 they actually call us with
vp->v_count--;
if (vp->v_count > 0) {
mutex_exit(&vp->v_lock);
- return;
+ return 0;
}
mutex_exit(&vp->v_lock);
* lose the open count for volume roots (mvstat 2), even though they
* will get VOP_INACTIVE'd when released by afs_PutFakeStat().
*/
- if (avc->opens > 0 && avc->mvstat == 0 && !(avc->states & CCore))
+ if (avc->opens > 0 && avc->mvstat == 0 && !(avc->f.states & CCore))
avc->opens = avc->execsOrWriters = 0;
afs_InactiveVCache(avc, acred);
+ return 0;
}
void
-gafs_inactive(avc, acred)
- register struct vcache *avc;
- struct AFS_UCRED *acred;
+gafs_inactive(register struct vcache *avc, AFS_UCRED *acred)
{
AFS_GLOCK();
- afs_inactive(avc, acred);
+ (void)afs_inactive(avc, acred);
AFS_GUNLOCK();
}
-gafs_fid(avc, fidpp)
- struct vcache *avc;
- struct fid **fidpp;
+int
+gafs_fid(struct vcache *avc, struct fid **fidpp)
{
register int code;