summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorDavid Chinner <dgc@sgi.com>2007-02-10 18:34:49 +1100
committerTim Shimmin <tes@sgi.com>2007-02-10 18:34:49 +1100
commit5e6a07dfe404cd4d8494d842b54706cb007fa04b (patch)
tree46cb354cfaedf75afb956036b5238a12f6c75f1d /fs
parentdc74eaad8cda9f12a885639b4f2513c99e9b483a (diff)
downloadlinux-5e6a07dfe404cd4d8494d842b54706cb007fa04b.tar.gz
linux-5e6a07dfe404cd4d8494d842b54706cb007fa04b.tar.bz2
linux-5e6a07dfe404cd4d8494d842b54706cb007fa04b.zip
[XFS] Current usage of buftarg flags is incorrect.
The {test,set,clear}_bit() operations take a bit index for the bit to operate on. The XBT_* flags are defined as bit fields which is incorrect, not to mention the way the bit fields are enumerated is broken too. This was only working by chance. Fix the definitions of the flags and make the code using them use the {test,set,clear}_bit() operations correctly. SGI-PV: 958639 SGI-Modid: xfs-linux-melb:xfs-kern:27565a Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.c15
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.h4
2 files changed, 9 insertions, 10 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index 946b00bf3841..168eecd8127e 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -1687,14 +1687,15 @@ STATIC int
xfs_buf_delwri_split(
xfs_buftarg_t *target,
struct list_head *list,
- unsigned long age,
- int flags)
+ unsigned long age)
{
xfs_buf_t *bp, *n;
struct list_head *dwq = &target->bt_delwrite_queue;
spinlock_t *dwlk = &target->bt_delwrite_lock;
int skipped = 0;
+ int force;
+ force = test_and_clear_bit(XBT_FORCE_FLUSH, &target->bt_flags);
INIT_LIST_HEAD(list);
spin_lock(dwlk);
list_for_each_entry_safe(bp, n, dwq, b_list) {
@@ -1702,7 +1703,7 @@ xfs_buf_delwri_split(
ASSERT(bp->b_flags & XBF_DELWRI);
if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) {
- if (!(flags & XBT_FORCE_FLUSH) &&
+ if (!force &&
time_before(jiffies, bp->b_queuetime + age)) {
xfs_buf_unlock(bp);
break;
@@ -1744,9 +1745,7 @@ xfsbufd(
xfs_buf_timer_centisecs * msecs_to_jiffies(10));
xfs_buf_delwri_split(target, &tmp,
- xfs_buf_age_centisecs * msecs_to_jiffies(10),
- test_bit(XBT_FORCE_FLUSH, &target->bt_flags)
- ? XBT_FORCE_FLUSH : 0);
+ xfs_buf_age_centisecs * msecs_to_jiffies(10));
count = 0;
while (!list_empty(&tmp)) {
@@ -1763,7 +1762,6 @@ xfsbufd(
if (count)
blk_run_address_space(target->bt_mapping);
- clear_bit(XBT_FORCE_FLUSH, &target->bt_flags);
} while (!kthread_should_stop());
return 0;
@@ -1786,7 +1784,8 @@ xfs_flush_buftarg(
xfs_buf_runall_queues(xfsdatad_workqueue);
xfs_buf_runall_queues(xfslogd_workqueue);
- pincount = xfs_buf_delwri_split(target, &tmp, 0, XBT_FORCE_FLUSH);
+ set_bit(XBT_FORCE_FLUSH, &target->bt_flags);
+ pincount = xfs_buf_delwri_split(target, &tmp, 0);
/*
* Dropped the delayed write list lock, now walk the temporary list
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h
index 9dd235cb0107..9e8ef8fef39f 100644
--- a/fs/xfs/linux-2.6/xfs_buf.h
+++ b/fs/xfs/linux-2.6/xfs_buf.h
@@ -69,8 +69,8 @@ typedef enum {
} xfs_buf_flags_t;
typedef enum {
- XBT_FORCE_SLEEP = (0 << 1),
- XBT_FORCE_FLUSH = (1 << 1),
+ XBT_FORCE_SLEEP = 0,
+ XBT_FORCE_FLUSH = 1,
} xfs_buftarg_flags_t;
typedef struct xfs_bufhash {