From d7886b0ba213fe53406e487ce291f25b9ee97c6e Mon Sep 17 00:00:00 2001 From: Chas Williams Date: Sat, 15 Oct 2005 16:52:13 +0000 Subject: [PATCH] STABLE14-linux-write-dirty-pages-once-20051015 FIXES 20561 this time for sure, only write back once (cherry picked from commit 7d0647d5ee9ae0d9b003f0e0c765522aa1433d23) --- src/afs/LINUX/osi_vnodeops.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 7552bc051c..f735cbc947 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -126,12 +126,7 @@ afs_linux_write(struct file *fp, const char *buf, size_t count, loff_t * offp) } ObtainWriteLock(&vcp->lock, 530); - vcp->m.Date = osi_Time(); /* set modification time */ afs_FakeClose(vcp, credp); - if (code >= 0) - code2 = afs_DoPartialWrite(vcp, &treq); - if (code2 && code >= 0) - code = (ssize_t) - code2; ReleaseWriteLock(&vcp->lock); afs_Trace4(afs_iclSetp, CM_TRACE_WRITEOP, ICL_TYPE_POINTER, vcp, @@ -1475,6 +1470,25 @@ afs_linux_updatepage(struct file *fp, struct page *pp, unsigned long offset, ip->i_size = vcp->m.Length; ip->i_blocks = ((vcp->m.Length + 1023) >> 10) << 1; + if (!code) { + struct vrequest treq; + + ObtainWriteLock(&vcp->lock, 533); + vcp->m.Date = osi_Time(); /* set modification time */ + if (!afs_InitReq(&treq, credp)) + code = afs_DoPartialWrite(vcp, &treq); + ReleaseWriteLock(&vcp->lock); + } + if (!code) { + struct vrequest treq; + + ObtainWriteLock(&vcp->lock, 533); + vcp->m.Date = osi_Time(); /* set modification time */ + 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, page_count(pp),