|
@@ -313,19 +313,34 @@ static int nfs_writepages_callback(struct page *page, struct writeback_control *
|
|
|
int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)
|
|
|
{
|
|
|
struct inode *inode = mapping->host;
|
|
|
+ unsigned long *bitlock = &NFS_I(inode)->flags;
|
|
|
struct nfs_pageio_descriptor pgio;
|
|
|
int err;
|
|
|
|
|
|
+ /* Stop dirtying of new pages while we sync */
|
|
|
+ err = wait_on_bit_lock(bitlock, NFS_INO_FLUSHING,
|
|
|
+ nfs_wait_bit_killable, TASK_KILLABLE);
|
|
|
+ if (err)
|
|
|
+ goto out_err;
|
|
|
+
|
|
|
nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGES);
|
|
|
|
|
|
nfs_pageio_init_write(&pgio, inode, wb_priority(wbc));
|
|
|
err = write_cache_pages(mapping, wbc, nfs_writepages_callback, &pgio);
|
|
|
nfs_pageio_complete(&pgio);
|
|
|
+
|
|
|
+ clear_bit_unlock(NFS_INO_FLUSHING, bitlock);
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
+ wake_up_bit(bitlock, NFS_INO_FLUSHING);
|
|
|
+
|
|
|
if (err < 0)
|
|
|
- return err;
|
|
|
- if (pgio.pg_error < 0)
|
|
|
- return pgio.pg_error;
|
|
|
+ goto out_err;
|
|
|
+ err = pgio.pg_error;
|
|
|
+ if (err < 0)
|
|
|
+ goto out_err;
|
|
|
return 0;
|
|
|
+out_err:
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1432,18 +1447,13 @@ static int nfs_write_mapping(struct address_space *mapping, int how)
|
|
|
{
|
|
|
struct writeback_control wbc = {
|
|
|
.bdi = mapping->backing_dev_info,
|
|
|
- .sync_mode = WB_SYNC_NONE,
|
|
|
+ .sync_mode = WB_SYNC_ALL,
|
|
|
.nr_to_write = LONG_MAX,
|
|
|
.range_start = 0,
|
|
|
.range_end = LLONG_MAX,
|
|
|
.for_writepages = 1,
|
|
|
};
|
|
|
- int ret;
|
|
|
|
|
|
- ret = __nfs_write_mapping(mapping, &wbc, how);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
- wbc.sync_mode = WB_SYNC_ALL;
|
|
|
return __nfs_write_mapping(mapping, &wbc, how);
|
|
|
}
|
|
|
|