Commit 0e3c9a22 authored by Jens Axboe's avatar Jens Axboe

Revert "writeback: fix WB_SYNC_NONE writeback from umount"

This reverts commit e913fc82.

We are investigating a hang associated with the WB_SYNC_NONE changes,
so revert them for now.

Conflicts:

	fs/fs-writeback.c
	mm/page-writeback.c
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent f17625b3
...@@ -45,7 +45,6 @@ struct wb_writeback_args { ...@@ -45,7 +45,6 @@ struct wb_writeback_args {
unsigned int for_kupdate:1; unsigned int for_kupdate:1;
unsigned int range_cyclic:1; unsigned int range_cyclic:1;
unsigned int for_background:1; unsigned int for_background:1;
unsigned int sb_pinned:1;
}; };
/* /*
...@@ -231,11 +230,6 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, ...@@ -231,11 +230,6 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi,
.sync_mode = WB_SYNC_ALL, .sync_mode = WB_SYNC_ALL,
.nr_pages = LONG_MAX, .nr_pages = LONG_MAX,
.range_cyclic = 0, .range_cyclic = 0,
/*
* Setting sb_pinned is not necessary for WB_SYNC_ALL, but
* lets make it explicitly clear.
*/
.sb_pinned = 1,
}; };
struct bdi_work work; struct bdi_work work;
...@@ -251,23 +245,21 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, ...@@ -251,23 +245,21 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi,
* @bdi: the backing device to write from * @bdi: the backing device to write from
* @sb: write inodes from this super_block * @sb: write inodes from this super_block
* @nr_pages: the number of pages to write * @nr_pages: the number of pages to write
* @sb_locked: caller already holds sb umount sem.
* *
* Description: * Description:
* This does WB_SYNC_NONE opportunistic writeback. The IO is only * This does WB_SYNC_NONE opportunistic writeback. The IO is only
* started when this function returns, we make no guarentees on * started when this function returns, we make no guarentees on
* completion. Caller specifies whether sb umount sem is held already or not. * completion. Caller need not hold sb s_umount semaphore.
* *
*/ */
void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb,
long nr_pages, int sb_locked) long nr_pages)
{ {
struct wb_writeback_args args = { struct wb_writeback_args args = {
.sb = sb, .sb = sb,
.sync_mode = WB_SYNC_NONE, .sync_mode = WB_SYNC_NONE,
.nr_pages = nr_pages, .nr_pages = nr_pages,
.range_cyclic = 1, .range_cyclic = 1,
.sb_pinned = sb_locked,
}; };
/* /*
...@@ -592,7 +584,7 @@ static enum sb_pin_state pin_sb_for_writeback(struct writeback_control *wbc, ...@@ -592,7 +584,7 @@ static enum sb_pin_state pin_sb_for_writeback(struct writeback_control *wbc,
/* /*
* Caller must already hold the ref for this * Caller must already hold the ref for this
*/ */
if (wbc->sync_mode == WB_SYNC_ALL || wbc->sb_pinned) { if (wbc->sync_mode == WB_SYNC_ALL) {
WARN_ON(!rwsem_is_locked(&sb->s_umount)); WARN_ON(!rwsem_is_locked(&sb->s_umount));
return SB_NOT_PINNED; return SB_NOT_PINNED;
} }
...@@ -766,7 +758,6 @@ static long wb_writeback(struct bdi_writeback *wb, ...@@ -766,7 +758,6 @@ static long wb_writeback(struct bdi_writeback *wb,
.for_kupdate = args->for_kupdate, .for_kupdate = args->for_kupdate,
.for_background = args->for_background, .for_background = args->for_background,
.range_cyclic = args->range_cyclic, .range_cyclic = args->range_cyclic,
.sb_pinned = args->sb_pinned,
}; };
unsigned long oldest_jif; unsigned long oldest_jif;
long wrote = 0; long wrote = 0;
...@@ -1214,18 +1205,6 @@ static void wait_sb_inodes(struct super_block *sb) ...@@ -1214,18 +1205,6 @@ static void wait_sb_inodes(struct super_block *sb)
iput(old_inode); iput(old_inode);
} }
static void __writeback_inodes_sb(struct super_block *sb, int sb_locked)
{
unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY);
unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS);
long nr_to_write;
nr_to_write = nr_dirty + nr_unstable +
(inodes_stat.nr_inodes - inodes_stat.nr_unused);
bdi_start_writeback(sb->s_bdi, sb, nr_to_write, sb_locked);
}
/** /**
* writeback_inodes_sb - writeback dirty inodes from given super_block * writeback_inodes_sb - writeback dirty inodes from given super_block
* @sb: the superblock * @sb: the superblock
...@@ -1237,21 +1216,16 @@ static void __writeback_inodes_sb(struct super_block *sb, int sb_locked) ...@@ -1237,21 +1216,16 @@ static void __writeback_inodes_sb(struct super_block *sb, int sb_locked)
*/ */
void writeback_inodes_sb(struct super_block *sb) void writeback_inodes_sb(struct super_block *sb)
{ {
__writeback_inodes_sb(sb, 0); unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY);
} unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS);
EXPORT_SYMBOL(writeback_inodes_sb); long nr_to_write;
/** nr_to_write = nr_dirty + nr_unstable +
* writeback_inodes_sb_locked - writeback dirty inodes from given super_block (inodes_stat.nr_inodes - inodes_stat.nr_unused);
* @sb: the superblock
* bdi_start_writeback(sb->s_bdi, sb, nr_to_write);
* Like writeback_inodes_sb(), except the caller already holds the
* sb umount sem.
*/
void writeback_inodes_sb_locked(struct super_block *sb)
{
__writeback_inodes_sb(sb, 1);
} }
EXPORT_SYMBOL(writeback_inodes_sb);
/** /**
* writeback_inodes_sb_if_idle - start writeback if none underway * writeback_inodes_sb_if_idle - start writeback if none underway
......
...@@ -42,7 +42,7 @@ static int __sync_filesystem(struct super_block *sb, int wait) ...@@ -42,7 +42,7 @@ static int __sync_filesystem(struct super_block *sb, int wait)
if (wait) if (wait)
sync_inodes_sb(sb); sync_inodes_sb(sb);
else else
writeback_inodes_sb_locked(sb); writeback_inodes_sb(sb);
if (sb->s_op->sync_fs) if (sb->s_op->sync_fs)
sb->s_op->sync_fs(sb, wait); sb->s_op->sync_fs(sb, wait);
......
...@@ -106,7 +106,7 @@ int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev); ...@@ -106,7 +106,7 @@ int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);
void bdi_unregister(struct backing_dev_info *bdi); void bdi_unregister(struct backing_dev_info *bdi);
int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int);
void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb,
long nr_pages, int sb_locked); long nr_pages);
int bdi_writeback_task(struct bdi_writeback *wb); int bdi_writeback_task(struct bdi_writeback *wb);
int bdi_has_dirty_io(struct backing_dev_info *bdi); int bdi_has_dirty_io(struct backing_dev_info *bdi);
void bdi_arm_supers_timer(void); void bdi_arm_supers_timer(void);
......
...@@ -65,15 +65,6 @@ struct writeback_control { ...@@ -65,15 +65,6 @@ struct writeback_control {
* so we use a single control to update them * so we use a single control to update them
*/ */
unsigned no_nrwrite_index_update:1; unsigned no_nrwrite_index_update:1;
/*
* For WB_SYNC_ALL, the sb must always be pinned. For WB_SYNC_NONE,
* the writeback code will pin the sb for the caller. However,
* for eg umount, the caller does WB_SYNC_NONE but already has
* the sb pinned. If the below is set, caller already has the
* sb pinned.
*/
unsigned sb_pinned:1;
}; };
/* /*
...@@ -82,7 +73,6 @@ struct writeback_control { ...@@ -82,7 +73,6 @@ struct writeback_control {
struct bdi_writeback; struct bdi_writeback;
int inode_wait(void *); int inode_wait(void *);
void writeback_inodes_sb(struct super_block *); void writeback_inodes_sb(struct super_block *);
void writeback_inodes_sb_locked(struct super_block *);
int writeback_inodes_sb_if_idle(struct super_block *); int writeback_inodes_sb_if_idle(struct super_block *);
void sync_inodes_sb(struct super_block *); void sync_inodes_sb(struct super_block *);
void writeback_inodes_wbc(struct writeback_control *wbc); void writeback_inodes_wbc(struct writeback_control *wbc);
......
...@@ -597,7 +597,7 @@ static void balance_dirty_pages(struct address_space *mapping, ...@@ -597,7 +597,7 @@ static void balance_dirty_pages(struct address_space *mapping,
(!laptop_mode && ((global_page_state(NR_FILE_DIRTY) (!laptop_mode && ((global_page_state(NR_FILE_DIRTY)
+ global_page_state(NR_UNSTABLE_NFS)) + global_page_state(NR_UNSTABLE_NFS))
> background_thresh))) > background_thresh)))
bdi_start_writeback(bdi, NULL, 0, 0); bdi_start_writeback(bdi, NULL, 0);
} }
void set_page_dirty_balance(struct page *page, int page_mkwrite) void set_page_dirty_balance(struct page *page, int page_mkwrite)
...@@ -707,7 +707,7 @@ void laptop_mode_timer_fn(unsigned long data) ...@@ -707,7 +707,7 @@ void laptop_mode_timer_fn(unsigned long data)
*/ */
if (bdi_has_dirty_io(&q->backing_dev_info)) if (bdi_has_dirty_io(&q->backing_dev_info))
bdi_start_writeback(&q->backing_dev_info, NULL, nr_pages, 0); bdi_start_writeback(&q->backing_dev_info, NULL, nr_pages);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment