afs: Fix afs_launder_page to not clear PG_writeback
Fix afs_launder_page() to not clear PG_writeback on the page it is
laundering as the flag isn't set in this case.
Fixes: 4343d00872
("afs: Get rid of the afs_writeback record")
Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
parent
248c944e21
commit
d383e346f9
@ -812,6 +812,7 @@ struct afs_operation {
|
|||||||
pgoff_t last; /* last page in mapping to deal with */
|
pgoff_t last; /* last page in mapping to deal with */
|
||||||
unsigned first_offset; /* offset into mapping[first] */
|
unsigned first_offset; /* offset into mapping[first] */
|
||||||
unsigned last_to; /* amount of mapping[last] */
|
unsigned last_to; /* amount of mapping[last] */
|
||||||
|
bool laundering; /* Laundering page, PG_writeback not set */
|
||||||
} store;
|
} store;
|
||||||
struct {
|
struct {
|
||||||
struct iattr *attr;
|
struct iattr *attr;
|
||||||
|
@ -396,6 +396,7 @@ static void afs_store_data_success(struct afs_operation *op)
|
|||||||
op->ctime = op->file[0].scb.status.mtime_client;
|
op->ctime = op->file[0].scb.status.mtime_client;
|
||||||
afs_vnode_commit_status(op, &op->file[0]);
|
afs_vnode_commit_status(op, &op->file[0]);
|
||||||
if (op->error == 0) {
|
if (op->error == 0) {
|
||||||
|
if (!op->store.laundering)
|
||||||
afs_pages_written_back(vnode, op->store.first, op->store.last);
|
afs_pages_written_back(vnode, op->store.first, op->store.last);
|
||||||
afs_stat_v(vnode, n_stores);
|
afs_stat_v(vnode, n_stores);
|
||||||
atomic_long_add((op->store.last * PAGE_SIZE + op->store.last_to) -
|
atomic_long_add((op->store.last * PAGE_SIZE + op->store.last_to) -
|
||||||
@ -415,7 +416,7 @@ static const struct afs_operation_ops afs_store_data_operation = {
|
|||||||
*/
|
*/
|
||||||
static int afs_store_data(struct address_space *mapping,
|
static int afs_store_data(struct address_space *mapping,
|
||||||
pgoff_t first, pgoff_t last,
|
pgoff_t first, pgoff_t last,
|
||||||
unsigned offset, unsigned to)
|
unsigned offset, unsigned to, bool laundering)
|
||||||
{
|
{
|
||||||
struct afs_vnode *vnode = AFS_FS_I(mapping->host);
|
struct afs_vnode *vnode = AFS_FS_I(mapping->host);
|
||||||
struct afs_operation *op;
|
struct afs_operation *op;
|
||||||
@ -448,6 +449,7 @@ static int afs_store_data(struct address_space *mapping,
|
|||||||
op->store.last = last;
|
op->store.last = last;
|
||||||
op->store.first_offset = offset;
|
op->store.first_offset = offset;
|
||||||
op->store.last_to = to;
|
op->store.last_to = to;
|
||||||
|
op->store.laundering = laundering;
|
||||||
op->mtime = vnode->vfs_inode.i_mtime;
|
op->mtime = vnode->vfs_inode.i_mtime;
|
||||||
op->flags |= AFS_OPERATION_UNINTR;
|
op->flags |= AFS_OPERATION_UNINTR;
|
||||||
op->ops = &afs_store_data_operation;
|
op->ops = &afs_store_data_operation;
|
||||||
@ -601,7 +603,7 @@ no_more:
|
|||||||
if (end > i_size)
|
if (end > i_size)
|
||||||
to = i_size & ~PAGE_MASK;
|
to = i_size & ~PAGE_MASK;
|
||||||
|
|
||||||
ret = afs_store_data(mapping, first, last, offset, to);
|
ret = afs_store_data(mapping, first, last, offset, to, false);
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case 0:
|
case 0:
|
||||||
ret = count;
|
ret = count;
|
||||||
@ -921,7 +923,7 @@ int afs_launder_page(struct page *page)
|
|||||||
|
|
||||||
trace_afs_page_dirty(vnode, tracepoint_string("launder"),
|
trace_afs_page_dirty(vnode, tracepoint_string("launder"),
|
||||||
page->index, priv);
|
page->index, priv);
|
||||||
ret = afs_store_data(mapping, page->index, page->index, t, f);
|
ret = afs_store_data(mapping, page->index, page->index, t, f, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_afs_page_dirty(vnode, tracepoint_string("laundered"),
|
trace_afs_page_dirty(vnode, tracepoint_string("laundered"),
|
||||||
|
Loading…
Reference in New Issue
Block a user