bitmap.c (e8b8e97f91b80f08a2f1b7ea4f81e7af61b2cc2f) bitmap.c (d3624466b56dd5b1886c1dff500525b544c19c83)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 *
4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
5 *
6 * This code builds two trees of free clusters extents.
7 * Trees are sorted by start of extent and by length of extent.
8 * NTFS_MAX_WND_EXTENTS defines the maximum number of elements in trees.

--- 15 unchanged lines hidden (view full) ---

24 */
25#define NTFS_MAX_WND_EXTENTS (32u * 1024u)
26
27struct rb_node_key {
28 struct rb_node node;
29 size_t key;
30};
31
1// SPDX-License-Identifier: GPL-2.0
2/*
3 *
4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
5 *
6 * This code builds two trees of free clusters extents.
7 * Trees are sorted by start of extent and by length of extent.
8 * NTFS_MAX_WND_EXTENTS defines the maximum number of elements in trees.

--- 15 unchanged lines hidden (view full) ---

24 */
25#define NTFS_MAX_WND_EXTENTS (32u * 1024u)
26
27struct rb_node_key {
28 struct rb_node node;
29 size_t key;
30};
31
32/* Tree is sorted by start (key). */
33struct e_node {
34 struct rb_node_key start; /* Tree sorted by start. */
35 struct rb_node_key count; /* Tree sorted by len. */
36};
37
38static int wnd_rescan(struct wnd_bitmap *wnd);
39static struct buffer_head *wnd_map(struct wnd_bitmap *wnd, size_t iw);
40static bool wnd_is_free_hlp(struct wnd_bitmap *wnd, size_t bit, size_t bits);

--- 1071 unchanged lines hidden (view full) ---

1112
1113 b_len = e->count.key;
1114 b_pos = e->start.key;
1115
1116scan_bitmap:
1117 sb = wnd->sb;
1118 log2_bits = sb->s_blocksize_bits + 3;
1119
32struct e_node {
33 struct rb_node_key start; /* Tree sorted by start. */
34 struct rb_node_key count; /* Tree sorted by len. */
35};
36
37static int wnd_rescan(struct wnd_bitmap *wnd);
38static struct buffer_head *wnd_map(struct wnd_bitmap *wnd, size_t iw);
39static bool wnd_is_free_hlp(struct wnd_bitmap *wnd, size_t bit, size_t bits);

--- 1071 unchanged lines hidden (view full) ---

1111
1112 b_len = e->count.key;
1113 b_pos = e->start.key;
1114
1115scan_bitmap:
1116 sb = wnd->sb;
1117 log2_bits = sb->s_blocksize_bits + 3;
1118
1120 /* At most two ranges [hint, max_alloc) + [0, hint) */
1119 /* At most two ranges [hint, max_alloc) + [0, hint). */
1121Again:
1122
1123 /* TODO: Optimize request for case nbits > wbits. */
1124 iw = hint >> log2_bits;
1125 wbits = sb->s_blocksize * 8;
1126 wpos = hint & (wbits - 1);
1127 prev_tail = 0;
1128 fbits_valid = true;

--- 107 unchanged lines hidden (view full) ---

1236 }
1237
1238 /* Increase 'prev_tail' and process next window. */
1239 prev_tail += wbits;
1240 wpos = 0;
1241 continue;
1242 }
1243
1120Again:
1121
1122 /* TODO: Optimize request for case nbits > wbits. */
1123 iw = hint >> log2_bits;
1124 wbits = sb->s_blocksize * 8;
1125 wpos = hint & (wbits - 1);
1126 prev_tail = 0;
1127 fbits_valid = true;

--- 107 unchanged lines hidden (view full) ---

1235 }
1236
1237 /* Increase 'prev_tail' and process next window. */
1238 prev_tail += wbits;
1239 wpos = 0;
1240 continue;
1241 }
1242
1244 /* Read window */
1243 /* Read window. */
1245 bh = wnd_map(wnd, iw);
1246 if (IS_ERR(bh)) {
1247 // TODO: Error.
1248 prev_tail = 0;
1249 wpos = 0;
1250 continue;
1251 }
1252

--- 242 unchanged lines hidden ---
1244 bh = wnd_map(wnd, iw);
1245 if (IS_ERR(bh)) {
1246 // TODO: Error.
1247 prev_tail = 0;
1248 wpos = 0;
1249 continue;
1250 }
1251

--- 242 unchanged lines hidden ---