rpms/kernel/devel fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch, NONE, 1.1 kernel.spec, 1.1985, 1.1986
Kyle McMartin
kyle at fedoraproject.org
Mon May 10 14:48:13 UTC 2010
- Previous message: rpms/konversation/devel .cvsignore, 1.16, 1.17 konversation.spec, 1.42, 1.43 sources, 1.16, 1.17
- Next message: rpms/kernel/F-13 crypto-aesni-kill-module_alias.patch, NONE, 1.1 config-x86_64-generic, 1.104, 1.105 kernel.spec, 1.2024, 1.2025
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: kyle
Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv11565
Modified Files:
kernel.spec
Added Files:
fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch
Log Message:
* Mon May 10 2010 Kyle McMartin <kyle at redhat.com>
- fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch (rhbz#588930)
fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch:
fs/fs-writeback.c | 48 +++++++++++++++++++++++++++++++++-----------
fs/sync.c | 2 -
include/linux/backing-dev.h | 2 -
include/linux/writeback.h | 10 +++++++++
mm/page-writeback.c | 2 -
5 files changed, 50 insertions(+), 14 deletions(-)
--- NEW FILE fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch ---
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 4b37f7c..c9ac9cb 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -45,6 +45,7 @@ struct wb_writeback_args {
int for_kupdate:1;
int range_cyclic:1;
int for_background:1;
+ int sb_pinned:1;
};
/*
@@ -230,6 +231,11 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi,
.sync_mode = WB_SYNC_ALL,
.nr_pages = LONG_MAX,
.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;
@@ -245,21 +251,23 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi,
* @bdi: the backing device to write from
* @sb: write inodes from this super_block
* @nr_pages: the number of pages to write
+ * @sb_locked: caller already holds sb umount sem.
*
* Description:
* This does WB_SYNC_NONE opportunistic writeback. The IO is only
* started when this function returns, we make no guarentees on
- * completion. Caller need not hold sb s_umount semaphore.
+ * completion. Caller specifies whether sb umount sem is held already or not.
*
*/
void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb,
- long nr_pages)
+ long nr_pages, int sb_locked)
{
struct wb_writeback_args args = {
.sb = sb,
.sync_mode = WB_SYNC_NONE,
.nr_pages = nr_pages,
.range_cyclic = 1,
+ .sb_pinned = sb_locked,
};
/*
@@ -577,7 +585,7 @@ static enum sb_pin_state pin_sb_for_writeback(struct writeback_control *wbc,
/*
* Caller must already hold the ref for this
*/
- if (wbc->sync_mode == WB_SYNC_ALL) {
+ if (wbc->sync_mode == WB_SYNC_ALL || wbc->sb_pinned) {
WARN_ON(!rwsem_is_locked(&sb->s_umount));
return SB_NOT_PINNED;
}
@@ -751,6 +759,7 @@ static long wb_writeback(struct bdi_writeback *wb,
.for_kupdate = args->for_kupdate,
.for_background = args->for_background,
.range_cyclic = args->range_cyclic,
+ .sb_pinned = args->sb_pinned,
};
unsigned long oldest_jif;
long wrote = 0;
@@ -1183,6 +1192,18 @@ static void wait_sb_inodes(struct super_block *sb)
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
* @sb: the superblock
@@ -1194,18 +1215,23 @@ static void wait_sb_inodes(struct super_block *sb)
*/
void writeback_inodes_sb(struct super_block *sb)
{
- 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);
+ __writeback_inodes_sb(sb, 0);
}
EXPORT_SYMBOL(writeback_inodes_sb);
/**
+ * writeback_inodes_sb_locked - writeback dirty inodes from given super_block
+ * @sb: the superblock
+ *
+ * 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);
+}
+
+/**
* writeback_inodes_sb_if_idle - start writeback if none underway
* @sb: the superblock
*
diff --git a/fs/sync.c b/fs/sync.c
index 92b2281..de6a441 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -42,7 +42,7 @@ static int __sync_filesystem(struct super_block *sb, int wait)
if (wait)
sync_inodes_sb(sb);
else
- writeback_inodes_sb(sb);
+ writeback_inodes_sb_locked(sb);
if (sb->s_op->sync_fs)
sb->s_op->sync_fs(sb, wait);
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index bd0e3c6..90e677a 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -103,7 +103,7 @@ int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);
void bdi_unregister(struct backing_dev_info *bdi);
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,
- long nr_pages);
+ long nr_pages, int sb_locked);
int bdi_writeback_task(struct bdi_writeback *wb);
int bdi_has_dirty_io(struct backing_dev_info *bdi);
diff --git a/include/linux/writeback.h b/include/linux/writeback.h
index 36520de..3790165 100644
--- a/include/linux/writeback.h
+++ b/include/linux/writeback.h
@@ -65,6 +65,15 @@ struct writeback_control {
* so we use a single control to update them
*/
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;
};
/*
@@ -73,6 +82,7 @@ struct writeback_control {
struct bdi_writeback;
int inode_wait(void *);
void writeback_inodes_sb(struct super_block *);
+void writeback_inodes_sb_locked(struct super_block *);
int writeback_inodes_sb_if_idle(struct super_block *);
void sync_inodes_sb(struct super_block *);
void writeback_inodes_wbc(struct writeback_control *wbc);
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 0b19943..49d3508 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -597,7 +597,7 @@ static void balance_dirty_pages(struct address_space *mapping,
(!laptop_mode && ((global_page_state(NR_FILE_DIRTY)
+ global_page_state(NR_UNSTABLE_NFS))
> background_thresh)))
- bdi_start_writeback(bdi, NULL, 0);
+ bdi_start_writeback(bdi, NULL, 0, 0);
}
void set_page_dirty_balance(struct page *page, int page_mkwrite)
Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.1985
retrieving revision 1.1986
diff -u -p -r1.1985 -r1.1986
--- kernel.spec 10 May 2010 14:37:15 -0000 1.1985
+++ kernel.spec 10 May 2010 14:48:12 -0000 1.1986
@@ -737,6 +737,8 @@ Patch2905: linux-2.6-v4l-dvb-gspca-fixes
# fs fixes
+Patch3000: fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch
+
# NFSv4
# VIA Nano / VX8xx updates
@@ -1205,6 +1207,7 @@ ApplyPatch linux-2.6-execshield.patch
# bugfixes to drivers and filesystems
#
ApplyPatch autofs-fix-link_count-usage.patch
+ApplyPatch fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch
# ext4
@@ -2023,6 +2026,9 @@ fi
%changelog
* Mon May 10 2010 Kyle McMartin <kyle at redhat.com>
+- fs-explicitly-pass-in-whether-sb-is-pinned-or-not.patch (rhbz#588930)
+
+* Mon May 10 2010 Kyle McMartin <kyle at redhat.com>
- linux-2.6-input-hid-quirk-egalax.patch: copy from F-13^H2.
* Mon May 10 2010 Kyle McMartin <kyle at redhat.com> 2.6.34-0.49.rc7.git0
- Previous message: rpms/konversation/devel .cvsignore, 1.16, 1.17 konversation.spec, 1.42, 1.43 sources, 1.16, 1.17
- Next message: rpms/kernel/F-13 crypto-aesni-kill-module_alias.patch, NONE, 1.1 config-x86_64-generic, 1.104, 1.105 kernel.spec, 1.2024, 1.2025
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the scm-commits
mailing list