projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
aio: only account I/O wait time in read_events if there are active requests
[powerpc.git]
/
fs
/
fs-writeback.c
diff --git
a/fs/fs-writeback.c
b/fs/fs-writeback.c
index
1f22fb5
..
0fca820
100644
(file)
--- a/
fs/fs-writeback.c
+++ b/
fs/fs-writeback.c
@@
-89,7
+89,7
@@
void __mark_inode_dirty(struct inode *inode, int flags)
if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev"))
printk(KERN_DEBUG
"%s(%d): dirtied inode %lu (%s) on %s\n",
if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev"))
printk(KERN_DEBUG
"%s(%d): dirtied inode %lu (%s) on %s\n",
- current->comm,
current->pid
, inode->i_ino,
+ current->comm,
task_pid_nr(current)
, inode->i_ino,
name, inode->i_sb->s_id);
}
name, inode->i_sb->s_id);
}
@@
-100,11
+100,11
@@
void __mark_inode_dirty(struct inode *inode, int flags)
inode->i_state |= flags;
/*
inode->i_state |= flags;
/*
- * If the inode is
locked, just update its dirty state.
+ * If the inode is
being synced, just update its dirty state.
* The unlocker will place the inode on the appropriate
* superblock list, based upon its state.
*/
* The unlocker will place the inode on the appropriate
* superblock list, based upon its state.
*/
- if (inode->i_state & I_
LOCK
)
+ if (inode->i_state & I_
SYNC
)
goto out;
/*
goto out;
/*
@@
-172,6
+172,15
@@
static void requeue_io(struct inode *inode)
list_move(&inode->i_list, &inode->i_sb->s_more_io);
}
list_move(&inode->i_list, &inode->i_sb->s_more_io);
}
+static void inode_sync_complete(struct inode *inode)
+{
+ /*
+ * Prevent speculative execution through spin_unlock(&inode_lock);
+ */
+ smp_mb();
+ wake_up_bit(&inode->i_state, __I_SYNC);
+}
+
/*
* Move expired dirty inodes from @delaying_queue to @dispatch_queue.
*/
/*
* Move expired dirty inodes from @delaying_queue to @dispatch_queue.
*/
@@
-199,6
+208,14
@@
static void queue_io(struct super_block *sb,
move_expired_inodes(&sb->s_dirty, &sb->s_io, older_than_this);
}
move_expired_inodes(&sb->s_dirty, &sb->s_io, older_than_this);
}
+int sb_has_dirty_inodes(struct super_block *sb)
+{
+ return !list_empty(&sb->s_dirty) ||
+ !list_empty(&sb->s_io) ||
+ !list_empty(&sb->s_more_io);
+}
+EXPORT_SYMBOL(sb_has_dirty_inodes);
+
/*
* Write a single inode's dirty pages and inode data out to disk.
* If `wait' is set, wait on the writeout.
/*
* Write a single inode's dirty pages and inode data out to disk.
* If `wait' is set, wait on the writeout.
@@
-217,11
+234,11
@@
__sync_single_inode(struct inode *inode, struct writeback_control *wbc)
int wait = wbc->sync_mode == WB_SYNC_ALL;
int ret;
int wait = wbc->sync_mode == WB_SYNC_ALL;
int ret;
- BUG_ON(inode->i_state & I_
LOCK
);
+ BUG_ON(inode->i_state & I_
SYNC
);
- /* Set I_
LOCK
, reset I_DIRTY */
+ /* Set I_
SYNC
, reset I_DIRTY */
dirty = inode->i_state & I_DIRTY;
dirty = inode->i_state & I_DIRTY;
- inode->i_state |= I_
LOCK
;
+ inode->i_state |= I_
SYNC
;
inode->i_state &= ~I_DIRTY;
spin_unlock(&inode_lock);
inode->i_state &= ~I_DIRTY;
spin_unlock(&inode_lock);
@@
-242,7
+259,7
@@
__sync_single_inode(struct inode *inode, struct writeback_control *wbc)
}
spin_lock(&inode_lock);
}
spin_lock(&inode_lock);
- inode->i_state &= ~I_
LOCK
;
+ inode->i_state &= ~I_
SYNC
;
if (!(inode->i_state & I_FREEING)) {
if (!(inode->i_state & I_DIRTY) &&
mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
if (!(inode->i_state & I_FREEING)) {
if (!(inode->i_state & I_DIRTY) &&
mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
@@
-297,7
+314,7
@@
__sync_single_inode(struct inode *inode, struct writeback_control *wbc)
list_move(&inode->i_list, &inode_unused);
}
}
list_move(&inode->i_list, &inode_unused);
}
}
-
wake_up_inod
e(inode);
+
inode_sync_complet
e(inode);
return ret;
}
return ret;
}
@@
-316,7
+333,7
@@
__writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
else
WARN_ON(inode->i_state & I_WILL_FREE);
else
WARN_ON(inode->i_state & I_WILL_FREE);
- if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_
LOCK
)) {
+ if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_
SYNC
)) {
struct address_space *mapping = inode->i_mapping;
int ret;
struct address_space *mapping = inode->i_mapping;
int ret;
@@
-342,16
+359,16
@@
__writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
/*
* It's a data-integrity sync. We must wait.
*/
/*
* It's a data-integrity sync. We must wait.
*/
- if (inode->i_state & I_
LOCK
) {
- DEFINE_WAIT_BIT(wq, &inode->i_state, __I_
LOCK
);
+ if (inode->i_state & I_
SYNC
) {
+ DEFINE_WAIT_BIT(wq, &inode->i_state, __I_
SYNC
);
- wqh = bit_waitqueue(&inode->i_state, __I_
LOCK
);
+ wqh = bit_waitqueue(&inode->i_state, __I_
SYNC
);
do {
spin_unlock(&inode_lock);
__wait_on_bit(wqh, &wq, inode_wait,
TASK_UNINTERRUPTIBLE);
spin_lock(&inode_lock);
do {
spin_unlock(&inode_lock);
__wait_on_bit(wqh, &wq, inode_wait,
TASK_UNINTERRUPTIBLE);
spin_lock(&inode_lock);
- } while (inode->i_state & I_
LOCK
);
+ } while (inode->i_state & I_
SYNC
);
}
return __sync_single_inode(inode, wbc);
}
}
return __sync_single_inode(inode, wbc);
}
@@
-384,7
+401,7
@@
__writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
* The inodes to be written are parked on sb->s_io. They are moved back onto
* sb->s_dirty as they are selected for writing. This way, none can be missed
* on the writer throttling path, and we get decent balancing between many
* The inodes to be written are parked on sb->s_io. They are moved back onto
* sb->s_dirty as they are selected for writing. This way, none can be missed
* on the writer throttling path, and we get decent balancing between many
- * throttled threads: we don't want them all piling up on
__wait_on_inode
.
+ * throttled threads: we don't want them all piling up on
inode_sync_wait
.
*/
static void
sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc)
*/
static void
sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc)
@@
-465,6
+482,8
@@
sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc)
if (wbc->nr_to_write <= 0)
break;
}
if (wbc->nr_to_write <= 0)
break;
}
+ if (!list_empty(&sb->s_more_io))
+ wbc->more_io = 1;
return; /* Leave any unwritten inodes on s_io */
}
return; /* Leave any unwritten inodes on s_io */
}
@@
-497,7
+516,7
@@
writeback_inodes(struct writeback_control *wbc)
restart:
sb = sb_entry(super_blocks.prev);
for (; sb != sb_entry(&super_blocks); sb = sb_entry(sb->s_list.prev)) {
restart:
sb = sb_entry(super_blocks.prev);
for (; sb != sb_entry(&super_blocks); sb = sb_entry(sb->s_list.prev)) {
- if (
!list_empty(&sb->s_dirty) || !list_empty(&sb->s_io
)) {
+ if (
sb_has_dirty_inodes(sb
)) {
/* we're making our own get_super here */
sb->s_count++;
spin_unlock(&sb_lock);
/* we're making our own get_super here */
sb->s_count++;
spin_unlock(&sb_lock);
@@
-651,7
+670,7
@@
int write_inode_now(struct inode *inode, int sync)
ret = __writeback_single_inode(inode, &wbc);
spin_unlock(&inode_lock);
if (sync)
ret = __writeback_single_inode(inode, &wbc);
spin_unlock(&inode_lock);
if (sync)
-
wait_on_inode
(inode);
+
inode_sync_wait
(inode);
return ret;
}
EXPORT_SYMBOL(write_inode_now);
return ret;
}
EXPORT_SYMBOL(write_inode_now);
@@
-726,7
+745,7
@@
int generic_osync_inode(struct inode *inode, struct address_space *mapping, int
err = err2;
}
else
err = err2;
}
else
-
wait_on_inode
(inode);
+
inode_sync_wait
(inode);
return err;
}
return err;
}