{
struct inode *ip = AFSTOV(avc);
- if (!avc->f.states & CPageWrite)
- avc->f.states |= CPageWrite;
- else
+ if (avc->f.states & CPageWrite)
return; /* someone already writing */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,5)
AFS_GLOCK();
ObtainWriteLock(&avc->lock, 121);
#endif
- avc->f.states &= ~CPageWrite;
}
/* Purge VM for a file when its callback is revoked.
if (code == ENOENT)
return ERR_PTR(0);
#endif
- else if ((code >= 0) && (code <= MAX_ERRNO))
+ else if ((code > 0) && (code <= MAX_ERRNO))
return ERR_PTR(-code);
else
return ERR_PTR(-EIO);
ICL_TYPE_POINTER, pp, ICL_TYPE_INT32, page_count(pp),
ICL_TYPE_INT32, 99999);
- ObtainReadLock(&vcp->lock);
+ ObtainWriteLock(&vcp->lock, 532);
if (vcp->f.states & CPageWrite) {
- ReleaseReadLock(&vcp->lock);
+ ReleaseWriteLock(&vcp->lock);
AFS_GUNLOCK();
maybe_unlock_kernel();
crfree(credp);
return(0);
#endif
}
- ReleaseReadLock(&vcp->lock);
+ vcp->states |= CPageWrite;
+ ReleaseWriteLock(&vcp->lock);
setup_uio(&tuio, &iovec, buffer, base, count, UIO_WRITE, AFS_UIOSYS);
i_size_write(ip, vcp->f.m.Length);
ip->i_blocks = ((vcp->f.m.Length + 1023) >> 10) << 1;
+ ObtainWriteLock(&vcp->lock, 533);
if (!code) {
struct vrequest treq;
- ObtainWriteLock(&vcp->lock, 533);
if (!afs_InitReq(&treq, credp))
code = afs_DoPartialWrite(vcp, &treq);
- ReleaseWriteLock(&vcp->lock);
}
code = code ? -code : count - tuio.uio_resid;
+ vcp->states &= ~CPageWrite;
+ ReleaseWriteLock(&vcp->lock);
+
afs_Trace4(afs_iclSetp, CM_TRACE_UPDATEPAGE, ICL_TYPE_POINTER, vcp,
ICL_TYPE_POINTER, pp, ICL_TYPE_INT32, page_count(pp),
ICL_TYPE_INT32, code);
do_it:
status = afs_linux_writepage_sync(inode, pp, 0, offset);
SetPageUptodate(pp);
- UnlockPage(pp);
+#if defined(WRITEPAGE_ACTIVATE)
+ if ( status != WRITEPAGE_ACTIVATE )
+#else
+ if ( status != AOP_WRITEPAGE_ACTIVATE )
+#endif
+ UnlockPage(pp);
if (status == offset)
return 0;
else