Merge branch 'akpm' (patches from Andrew Morton)
Merge first patch-bomb from Andrew Morton: "Quite a lot of other stuff is banked up awaiting further next->mainline merging, but this batch contains: - Lots of random misc patches - OCFS2 - Most of MM - backlight updates - lib/ updates - printk updates - checkpatch updates - epoll tweaking - rtc updates - hfs - hfsplus - documentation - procfs - update gcov to gcc-4.7 format - IPC" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (269 commits) ipc, msg: fix message length check for negative values ipc/util.c: remove unnecessary work pending test devpts: plug the memory leak in kill_sb ./Makefile: export initial ramdisk compression config option init/Kconfig: add option to disable kernel compression drivers: w1: make w1_slave::flags long to avoid memory corruption drivers/w1/masters/ds1wm.cuse dev_get_platdata() drivers/memstick/core/ms_block.c: fix unreachable state in h_msb_read_page() drivers/memstick/core/mspro_block.c: fix attributes array allocation drivers/pps/clients/pps-gpio.c: remove redundant of_match_ptr kernel/panic.c: reduce 1 byte usage for print tainted buffer gcov: reuse kbasename helper kernel/gcov/fs.c: use pr_warn() kernel/module.c: use pr_foo() gcov: compile specific gcov implementation based on gcc version gcov: add support for gcc 4.7 gcov format gcov: move gcov structs definitions to a gcc version specific file kernel/taskstats.c: return -ENOMEM when alloc memory fails in add_del_listener() kernel/taskstats.c: add nla_nest_cancel() for failure processing between nla_nest_start() and nla_nest_end() kernel/sysctl_binary.c: use scnprintf() instead of snprintf() ...
This commit is contained in:
@@ -40,13 +40,18 @@
|
||||
struct wb_writeback_work {
|
||||
long nr_pages;
|
||||
struct super_block *sb;
|
||||
unsigned long *older_than_this;
|
||||
/*
|
||||
* Write only inodes dirtied before this time. Don't forget to set
|
||||
* older_than_this_is_set when you set this.
|
||||
*/
|
||||
unsigned long older_than_this;
|
||||
enum writeback_sync_modes sync_mode;
|
||||
unsigned int tagged_writepages:1;
|
||||
unsigned int for_kupdate:1;
|
||||
unsigned int range_cyclic:1;
|
||||
unsigned int for_background:1;
|
||||
unsigned int for_sync:1; /* sync(2) WB_SYNC_ALL writeback */
|
||||
unsigned int older_than_this_is_set:1;
|
||||
enum wb_reason reason; /* why was writeback initiated? */
|
||||
|
||||
struct list_head list; /* pending work list */
|
||||
@@ -247,10 +252,10 @@ static int move_expired_inodes(struct list_head *delaying_queue,
|
||||
int do_sb_sort = 0;
|
||||
int moved = 0;
|
||||
|
||||
WARN_ON_ONCE(!work->older_than_this_is_set);
|
||||
while (!list_empty(delaying_queue)) {
|
||||
inode = wb_inode(delaying_queue->prev);
|
||||
if (work->older_than_this &&
|
||||
inode_dirtied_after(inode, *work->older_than_this))
|
||||
if (inode_dirtied_after(inode, work->older_than_this))
|
||||
break;
|
||||
list_move(&inode->i_wb_list, &tmp);
|
||||
moved++;
|
||||
@@ -734,6 +739,8 @@ static long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages,
|
||||
.sync_mode = WB_SYNC_NONE,
|
||||
.range_cyclic = 1,
|
||||
.reason = reason,
|
||||
.older_than_this = jiffies,
|
||||
.older_than_this_is_set = 1,
|
||||
};
|
||||
|
||||
spin_lock(&wb->list_lock);
|
||||
@@ -792,12 +799,13 @@ static long wb_writeback(struct bdi_writeback *wb,
|
||||
{
|
||||
unsigned long wb_start = jiffies;
|
||||
long nr_pages = work->nr_pages;
|
||||
unsigned long oldest_jif;
|
||||
struct inode *inode;
|
||||
long progress;
|
||||
|
||||
oldest_jif = jiffies;
|
||||
work->older_than_this = &oldest_jif;
|
||||
if (!work->older_than_this_is_set) {
|
||||
work->older_than_this = jiffies;
|
||||
work->older_than_this_is_set = 1;
|
||||
}
|
||||
|
||||
spin_lock(&wb->list_lock);
|
||||
for (;;) {
|
||||
@@ -831,10 +839,10 @@ static long wb_writeback(struct bdi_writeback *wb,
|
||||
* safe.
|
||||
*/
|
||||
if (work->for_kupdate) {
|
||||
oldest_jif = jiffies -
|
||||
work->older_than_this = jiffies -
|
||||
msecs_to_jiffies(dirty_expire_interval * 10);
|
||||
} else if (work->for_background)
|
||||
oldest_jif = jiffies;
|
||||
work->older_than_this = jiffies;
|
||||
|
||||
trace_writeback_start(wb->bdi, work);
|
||||
if (list_empty(&wb->b_io))
|
||||
@@ -1346,18 +1354,21 @@ EXPORT_SYMBOL(try_to_writeback_inodes_sb);
|
||||
|
||||
/**
|
||||
* sync_inodes_sb - sync sb inode pages
|
||||
* @sb: the superblock
|
||||
* @sb: the superblock
|
||||
* @older_than_this: timestamp
|
||||
*
|
||||
* This function writes and waits on any dirty inode belonging to this
|
||||
* super_block.
|
||||
* superblock that has been dirtied before given timestamp.
|
||||
*/
|
||||
void sync_inodes_sb(struct super_block *sb)
|
||||
void sync_inodes_sb(struct super_block *sb, unsigned long older_than_this)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(done);
|
||||
struct wb_writeback_work work = {
|
||||
.sb = sb,
|
||||
.sync_mode = WB_SYNC_ALL,
|
||||
.nr_pages = LONG_MAX,
|
||||
.older_than_this = older_than_this,
|
||||
.older_than_this_is_set = 1,
|
||||
.range_cyclic = 0,
|
||||
.done = &done,
|
||||
.reason = WB_REASON_SYNC,
|
||||
|
||||
Reference in New Issue
Block a user