From 0e507b83d96b58b0839415b78fd4e3d8605fd2e9 Mon Sep 17 00:00:00 2001 From: Chas Williams Date: Thu, 1 Aug 2002 20:12:01 +0000 Subject: [PATCH] STABLE12-linux-cleanup-partial-writes-20020801 Clean up partial write support on Linux by calling afs_DoPartialWrite from afs_linux_writepage_sync. (cherry picked from commit 14dc5dfa08cfe64f9abd3e5d98a5e6dc08f69736) --- src/afs/LINUX/osi_vnodeops.c | 11 +++++++++++ src/afs/VNOPS/afs_vnop_write.c | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 85c8809d4..e58af0ac7 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -1405,13 +1405,24 @@ int afs_linux_writepage_sync(struct inode *ip, struct page *pp, ICL_TYPE_POINTER, pp, ICL_TYPE_INT32, atomic_read(&pp->count), ICL_TYPE_INT32, 99999); + setup_uio(&tuio, &iovec, buffer, base, count, UIO_WRITE, AFS_UIOSYS); code = afs_write(vcp, &tuio, f_flags, credp, 0); vcache2inode(vcp); + if (!code && afs_stats_cmperf.cacheCurrDirtyChunks > + afs_stats_cmperf.cacheMaxDirtyChunks) { + 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; + afs_Trace4(afs_iclSetp, CM_TRACE_UPDATEPAGE, ICL_TYPE_POINTER, vcp, ICL_TYPE_POINTER, pp, ICL_TYPE_INT32, atomic_read(&pp->count), diff --git a/src/afs/VNOPS/afs_vnop_write.c b/src/afs/VNOPS/afs_vnop_write.c index a2b926b98..6fe89f901 100644 --- a/src/afs/VNOPS/afs_vnop_write.c +++ b/src/afs/VNOPS/afs_vnop_write.c @@ -283,7 +283,7 @@ afs_MemWrite(avc, auio, aio, acred, noLock) if (filePos > avc->m.Length) avc->m.Length = filePos; #endif -#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV) +#if !defined(AFS_VM_RDWR_ENV) /* * If write is implemented via VM, afs_DoPartialWrite() is called from * the high-level write op. @@ -580,7 +580,7 @@ afs_UFSWrite(avc, auio, aio, acred, noLock) } #endif osi_UFSClose(tfile); -#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV) +#if !defined(AFS_VM_RDWR_ENV) /* * If write is implemented via VM, afs_DoPartialWrite() is called from * the high-level write op. -- 2.39.5