{
        int err = 0;
        struct super_block *sb = wnd->sb;
-       size_t bits0 = bits;
        u32 wbits = 8 * sb->s_blocksize;
        size_t iw = bit >> (sb->s_blocksize_bits + 3);
        u32 wbit = bit & (wbits - 1);
        struct buffer_head *bh;
+       u32 op;
 
-       while (iw < wnd->nwnd && bits) {
-               u32 tail, op;
-
+       for (; iw < wnd->nwnd && bits; iw++, bit += op, bits -= op, wbit = 0) {
                if (iw + 1 == wnd->nwnd)
                        wbits = wnd->bits_last;
 
-               tail = wbits - wbit;
-               op = min_t(u32, tail, bits);
+               op = min_t(u32, wbits - wbit, bits);
 
                bh = wnd_map(wnd, iw);
                if (IS_ERR(bh)) {
                ntfs_bitmap_clear_le(bh->b_data, wbit, op);
 
                wnd->free_bits[iw] += op;
+               wnd->total_zeroes += op;
 
                set_buffer_uptodate(bh);
                mark_buffer_dirty(bh);
                unlock_buffer(bh);
                put_bh(bh);
 
-               wnd->total_zeroes += op;
-               bits -= op;
-               wbit = 0;
-               iw += 1;
+               wnd_add_free_ext(wnd, bit, op, false);
        }
-
-       wnd_add_free_ext(wnd, bit, bits0, false);
-
        return err;
 }
 
 {
        int err = 0;
        struct super_block *sb = wnd->sb;
-       size_t bits0 = bits;
        size_t iw = bit >> (sb->s_blocksize_bits + 3);
        u32 wbits = 8 * sb->s_blocksize;
        u32 wbit = bit & (wbits - 1);
        struct buffer_head *bh;
+       u32 op;
 
-       while (iw < wnd->nwnd && bits) {
-               u32 tail, op;
-
+       for (; iw < wnd->nwnd && bits; iw++, bit += op, bits -= op, wbit = 0) {
                if (unlikely(iw + 1 == wnd->nwnd))
                        wbits = wnd->bits_last;
 
-               tail = wbits - wbit;
-               op = min_t(u32, tail, bits);
+               op = min_t(u32, wbits - wbit, bits);
 
                bh = wnd_map(wnd, iw);
                if (IS_ERR(bh)) {
 
                ntfs_bitmap_set_le(bh->b_data, wbit, op);
                wnd->free_bits[iw] -= op;
+               wnd->total_zeroes -= op;
 
                set_buffer_uptodate(bh);
                mark_buffer_dirty(bh);
                unlock_buffer(bh);
                put_bh(bh);
 
-               wnd->total_zeroes -= op;
-               bits -= op;
-               wbit = 0;
-               iw += 1;
+               if (!RB_EMPTY_ROOT(&wnd->start_tree))
+                       wnd_remove_free_ext(wnd, bit, op);
        }
-
-       if (!RB_EMPTY_ROOT(&wnd->start_tree))
-               wnd_remove_free_ext(wnd, bit, bits0);
-
        return err;
 }
 
        size_t iw = bit >> (sb->s_blocksize_bits + 3);
        u32 wbits = 8 * sb->s_blocksize;
        u32 wbit = bit & (wbits - 1);
+       u32 op;
 
-       while (iw < wnd->nwnd && bits) {
-               u32 tail, op;
-
+       for (; iw < wnd->nwnd && bits; iw++, bits -= op, wbit = 0) {
                if (unlikely(iw + 1 == wnd->nwnd))
                        wbits = wnd->bits_last;
 
-               tail = wbits - wbit;
-               op = min_t(u32, tail, bits);
+               op = min_t(u32, wbits - wbit, bits);
 
                if (wbits != wnd->free_bits[iw]) {
                        bool ret;
                        if (!ret)
                                return false;
                }
-
-               bits -= op;
-               wbit = 0;
-               iw += 1;
        }
 
        return true;
        size_t iw = bit >> (sb->s_blocksize_bits + 3);
        u32 wbits = 8 * sb->s_blocksize;
        u32 wbit = bit & (wbits - 1);
+       u32 op;
        size_t end;
        struct rb_node *n;
        struct e_node *e;
                return false;
 
 use_wnd:
-       while (iw < wnd->nwnd && bits) {
-               u32 tail, op;
-
+       for (; iw < wnd->nwnd && bits; iw++, bits -= op, wbit = 0) {
                if (unlikely(iw + 1 == wnd->nwnd))
                        wbits = wnd->bits_last;
 
-               tail = wbits - wbit;
-               op = min_t(u32, tail, bits);
+               op = min_t(u32, wbits - wbit, bits);
 
                if (wnd->free_bits[iw]) {
                        bool ret;
                        if (!ret)
                                goto out;
                }
-
-               bits -= op;
-               wbit = 0;
-               iw += 1;
        }
        ret = true;