|
@@ -125,7 +125,12 @@ try_again:
|
|
|
page->index, priv);
|
|
|
goto flush_conflicting_write;
|
|
|
}
|
|
|
- if (to < f || from > t)
|
|
|
+ /* If the file is being filled locally, allow inter-write
|
|
|
+ * spaces to be merged into writes. If it's not, only write
|
|
|
+ * back what the user gives us.
|
|
|
+ */
|
|
|
+ if (!test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags) &&
|
|
|
+ (to < f || from > t))
|
|
|
goto flush_conflicting_write;
|
|
|
if (from < f)
|
|
|
f = from;
|
|
@@ -419,7 +424,8 @@ static int afs_write_back_from_locked_page(struct address_space *mapping,
|
|
|
trace_afs_page_dirty(vnode, tracepoint_string("WARN"),
|
|
|
primary_page->index, priv);
|
|
|
|
|
|
- if (start >= final_page || to < PAGE_SIZE)
|
|
|
+ if (start >= final_page ||
|
|
|
+ (to < PAGE_SIZE && !test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags)))
|
|
|
goto no_more;
|
|
|
|
|
|
start++;
|
|
@@ -440,9 +446,10 @@ static int afs_write_back_from_locked_page(struct address_space *mapping,
|
|
|
}
|
|
|
|
|
|
for (loop = 0; loop < n; loop++) {
|
|
|
- if (to != PAGE_SIZE)
|
|
|
- break;
|
|
|
page = pages[loop];
|
|
|
+ if (to != PAGE_SIZE &&
|
|
|
+ !test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags))
|
|
|
+ break;
|
|
|
if (page->index > final_page)
|
|
|
break;
|
|
|
if (!trylock_page(page))
|
|
@@ -455,7 +462,8 @@ static int afs_write_back_from_locked_page(struct address_space *mapping,
|
|
|
priv = page_private(page);
|
|
|
f = priv & AFS_PRIV_MAX;
|
|
|
t = priv >> AFS_PRIV_SHIFT;
|
|
|
- if (f != 0) {
|
|
|
+ if (f != 0 &&
|
|
|
+ !test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags)) {
|
|
|
unlock_page(page);
|
|
|
break;
|
|
|
}
|
|
@@ -740,20 +748,6 @@ int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
|
|
return file_write_and_wait_range(file, start, end);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Flush out all outstanding writes on a file opened for writing when it is
|
|
|
- * closed.
|
|
|
- */
|
|
|
-int afs_flush(struct file *file, fl_owner_t id)
|
|
|
-{
|
|
|
- _enter("");
|
|
|
-
|
|
|
- if ((file->f_mode & FMODE_WRITE) == 0)
|
|
|
- return 0;
|
|
|
-
|
|
|
- return vfs_fsync(file, 0);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* notification that a previously read-only page is about to become writable
|
|
|
* - if it returns an error, the caller will deliver a bus error signal
|