Skip to content

Commit

Permalink
fix ceph_write_end()
Browse files Browse the repository at this point in the history
don't zero on short copies; if the page was uptodate it's just plain
wrong, and if it wasn't we'll be better off just returning 0 and
buggering off.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Dec 10, 2016
1 parent c0cf3ef commit b9de313
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions fs/ceph/addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1276,25 +1276,27 @@ static int ceph_write_end(struct file *file, struct address_space *mapping,
struct page *page, void *fsdata)
{
struct inode *inode = file_inode(file);
unsigned from = pos & (PAGE_SIZE - 1);
int check_cap = 0;

dout("write_end file %p inode %p page %p %d~%d (%d)\n", file,
inode, page, (int)pos, (int)copied, (int)len);

/* zero the stale part of the page if we did a short copy */
if (copied < len)
zero_user_segment(page, from+copied, len);
if (!PageUptodate(page)) {
if (copied < len) {
copied = 0;
goto out;
}
SetPageUptodate(page);
}

/* did file size increase? */
if (pos+copied > i_size_read(inode))
check_cap = ceph_inode_set_size(inode, pos+copied);

if (!PageUptodate(page))
SetPageUptodate(page);

set_page_dirty(page);

out:
unlock_page(page);
put_page(page);

Expand Down

0 comments on commit b9de313

Please sign in to comment.