Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 124886
b: refs/heads/master
c: 2e65609
h: refs/heads/master
v: v3
  • Loading branch information
Dave Chinner authored and Niv Sardi committed Dec 1, 2008
1 parent b2d72c8 commit fdc31ce
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 65795910c1b798f8a47181b48cf6eb163a15e778
refs/heads/master: 2e6560929d8ab4b650fecc3a87013852b34f0922
23 changes: 20 additions & 3 deletions trunk/fs/xfs/linux-2.6/xfs_fs_subr.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ int fs_noerr(void) { return 0; }
int fs_nosys(void) { return ENOSYS; }
void fs_noval(void) { return; }

/*
* note: all filemap functions return negative error codes. These
* need to be inverted before returning to the xfs core functions.
*/
void
xfs_tosspages(
xfs_inode_t *ip,
Expand Down Expand Up @@ -53,7 +57,7 @@ xfs_flushinval_pages(
if (!ret)
truncate_inode_pages(mapping, first);
}
return ret;
return -ret;
}

int
Expand All @@ -72,10 +76,23 @@ xfs_flush_pages(
xfs_iflags_clear(ip, XFS_ITRUNCATED);
ret = filemap_fdatawrite(mapping);
if (flags & XFS_B_ASYNC)
return ret;
return -ret;
ret2 = filemap_fdatawait(mapping);
if (!ret)
ret = ret2;
}
return ret;
return -ret;
}

int
xfs_wait_on_pages(
xfs_inode_t *ip,
xfs_off_t first,
xfs_off_t last)
{
struct address_space *mapping = VFS_I(ip)->i_mapping;

if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK))
return -filemap_fdatawait(mapping);
return 0;
}
2 changes: 1 addition & 1 deletion trunk/fs/xfs/linux-2.6/xfs_lrw.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ xfs_read(

if (unlikely(ioflags & IO_ISDIRECT)) {
if (inode->i_mapping->nrpages)
ret = xfs_flushinval_pages(ip, (*offset & PAGE_CACHE_MASK),
ret = -xfs_flushinval_pages(ip, (*offset & PAGE_CACHE_MASK),
-1, FI_REMAPF_LOCKED);
mutex_unlock(&inode->i_mutex);
if (ret) {
Expand Down
13 changes: 9 additions & 4 deletions trunk/fs/xfs/linux-2.6/xfs_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -990,21 +990,26 @@ xfs_fs_write_inode(
struct inode *inode,
int sync)
{
struct xfs_inode *ip = XFS_I(inode);
int error = 0;
int flags = 0;

xfs_itrace_entry(XFS_I(inode));
xfs_itrace_entry(ip);
if (sync) {
filemap_fdatawait(inode->i_mapping);
error = xfs_wait_on_pages(ip, 0, -1);
if (error)
goto out_error;
flags |= FLUSH_SYNC;
}
error = xfs_inode_flush(XFS_I(inode), flags);
error = xfs_inode_flush(ip, flags);

out_error:
/*
* if we failed to write out the inode then mark
* it dirty again so we'll try again later.
*/
if (error)
xfs_mark_inode_dirty_sync(XFS_I(inode));
xfs_mark_inode_dirty_sync(ip);

return -error;
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/xfs/xfs_vnodeops.c
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,7 @@ xfs_fsync(
return XFS_ERROR(EIO);

/* capture size updates in I/O completion before writing the inode. */
error = filemap_fdatawait(VFS_I(ip)->i_mapping);
error = xfs_wait_on_pages(ip, 0, -1);
if (error)
return XFS_ERROR(error);

Expand Down
1 change: 1 addition & 0 deletions trunk/fs/xfs/xfs_vnodeops.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,6 @@ int xfs_flushinval_pages(struct xfs_inode *ip, xfs_off_t first,
xfs_off_t last, int fiopt);
int xfs_flush_pages(struct xfs_inode *ip, xfs_off_t first,
xfs_off_t last, uint64_t flags, int fiopt);
int xfs_wait_on_pages(struct xfs_inode *ip, xfs_off_t first, xfs_off_t last);

#endif /* _XFS_VNODEOPS_H */

0 comments on commit fdc31ce

Please sign in to comment.