From: Chas Williams Date: Sat, 15 Oct 2005 16:51:09 +0000 (+0000) Subject: linux-write-dirty-pages-once-20051015 X-Git-Tag: openafs-devel-1_5_0~244 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=7d0647d5ee9ae0d9b003f0e0c765522aa1433d23 linux-write-dirty-pages-once-20051015 FIXES 20561 this time for sure, only write back once --- diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 7552bc0..f735cbc 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),