linux-write-dirty-pages-once-20051015
authorChas Williams <chas@cmf.nrl.navy.mil>
Sat, 15 Oct 2005 16:51:09 +0000 (16:51 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 15 Oct 2005 16:51:09 +0000 (16:51 +0000)
FIXES 20561

this time for sure, only write back once

src/afs/LINUX/osi_vnodeops.c

index 7552bc0..f735cbc 100644 (file)
@@ -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),