[XFS] Current usage of buftarg flags is incorrect.
authorDavid Chinner <dgc@sgi.com>
Sat, 10 Feb 2007 07:34:49 +0000 (18:34 +1100)
committerTim Shimmin <tes@sgi.com>
Sat, 10 Feb 2007 07:34:49 +0000 (18:34 +1100)
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>
fs/xfs/linux-2.6/xfs_buf.c
fs/xfs/linux-2.6/xfs_buf.h

index 946b00bf38414491d01930e433fc09b7c2b0dd99..168eecd8127ea578823e5a2c1ced964aa2f81480 100644 (file)
@@ -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
index 9dd235cb01070623795c7e880c58636465ae17b6..9e8ef8fef39fff7f5c58d00209b42bdd0d60569e 100644 (file)
@@ -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 {