• Home
  • Raw
  • Download

Lines Matching refs:iter

14 static ssize_t write_block(struct exfat_de_iter *iter, unsigned int block)  in write_block()  argument
17 struct exfat *exfat = iter->exfat; in write_block()
21 desc = &iter->buffer_desc[block & 0x01]; in write_block()
24 for (i = 0; i < iter->read_size / iter->write_size; i++) { in write_block()
27 desc->buffer + i * iter->write_size, in write_block()
28 iter->write_size, in write_block()
29 device_offset + i * iter->write_size) in write_block()
30 != (ssize_t)iter->write_size) in write_block()
38 static int read_ahead_first_blocks(struct exfat_de_iter *iter) in read_ahead_first_blocks() argument
41 struct exfat *exfat = iter->exfat; in read_ahead_first_blocks()
45 clus_count = iter->parent->size / exfat->clus_size; in read_ahead_first_blocks()
48 iter->ra_begin_offset = 0; in read_ahead_first_blocks()
49 iter->ra_next_clus = 1; in read_ahead_first_blocks()
52 iter->ra_begin_offset = 0; in read_ahead_first_blocks()
53 iter->ra_next_clus = 0; in read_ahead_first_blocks()
54 size = iter->ra_partial_size; in read_ahead_first_blocks()
57 exfat_c2o(exfat, iter->parent->first_clus), size, in read_ahead_first_blocks()
68 static int read_ahead_next_blocks(struct exfat_de_iter *iter, in read_ahead_next_blocks() argument
72 struct exfat *exfat = iter->exfat; in read_ahead_next_blocks()
78 clus_count = iter->parent->size / exfat->clus_size; in read_ahead_next_blocks()
81 if (ra_clus == iter->ra_next_clus && in read_ahead_next_blocks()
82 offset >= iter->ra_begin_offset) { in read_ahead_next_blocks()
83 ret = get_next_clus(exfat, iter->parent, in read_ahead_next_blocks()
90 exfat->clus_size : iter->ra_partial_size; in read_ahead_next_blocks()
94 iter->ra_next_clus = ra_clus + 1; in read_ahead_next_blocks()
95 iter->ra_begin_offset = 0; in read_ahead_next_blocks()
98 if (offset >= iter->ra_begin_offset && in read_ahead_next_blocks()
99 offset + iter->ra_partial_size <= in read_ahead_next_blocks()
102 offset + iter->ra_partial_size; in read_ahead_next_blocks()
104 device_offset, iter->ra_partial_size, in read_ahead_next_blocks()
106 iter->ra_begin_offset = in read_ahead_next_blocks()
107 offset + iter->ra_partial_size; in read_ahead_next_blocks()
117 static int read_ahead_next_dir_blocks(struct exfat_de_iter *iter) in read_ahead_next_dir_blocks() argument
120 struct exfat *exfat = iter->exfat; in read_ahead_next_dir_blocks()
129 if (iter->parent == list_entry(current, struct exfat_inode, list) && in read_ahead_next_dir_blocks()
135 iter->ra_partial_size, in read_ahead_next_dir_blocks()
145 static ssize_t read_block(struct exfat_de_iter *iter, unsigned int block) in read_block() argument
147 struct exfat *exfat = iter->exfat; in read_block()
152 desc = &iter->buffer_desc[block & 0x01]; in read_block()
154 desc->p_clus = iter->parent->first_clus; in read_block()
159 if (write_block(iter, block)) in read_block()
163 if (block > iter->parent->size / iter->read_size) in read_block()
166 prev_desc = &iter->buffer_desc[(block-1) & 0x01]; in read_block()
167 if (prev_desc->offset + 2 * iter->read_size <= in read_block()
170 desc->offset = prev_desc->offset + iter->read_size; in read_block()
172 ret = get_next_clus(exfat, iter->parent, in read_block()
184 iter->read_size, device_offset); in read_block()
192 if (desc->buffer[iter->read_size - 32] != EXFAT_LAST) in read_block()
193 read_ahead_next_blocks(iter, in read_block()
194 (block * iter->read_size) / exfat->clus_size, in read_block()
195 (block * iter->read_size) % exfat->clus_size, in read_block()
198 read_ahead_next_dir_blocks(iter); in read_block()
202 int exfat_de_iter_init(struct exfat_de_iter *iter, struct exfat *exfat, in exfat_de_iter_init() argument
205 iter->exfat = exfat; in exfat_de_iter_init()
206 iter->parent = dir; in exfat_de_iter_init()
207 iter->write_size = exfat->sect_size; in exfat_de_iter_init()
208 iter->read_size = exfat->clus_size <= 4*KB ? exfat->clus_size : 4*KB; in exfat_de_iter_init()
210 iter->ra_partial_size = MAX(4 * KB, exfat->clus_size / 2); in exfat_de_iter_init()
212 iter->ra_partial_size = exfat->clus_size / 4; in exfat_de_iter_init()
213 iter->ra_partial_size = MIN(iter->ra_partial_size, 8 * KB); in exfat_de_iter_init()
215 if (!iter->buffer_desc) in exfat_de_iter_init()
216 iter->buffer_desc = exfat->buffer_desc; in exfat_de_iter_init()
218 if (iter->parent->size == 0) in exfat_de_iter_init()
221 read_ahead_first_blocks(iter); in exfat_de_iter_init()
222 if (read_block(iter, 0) != (ssize_t)iter->read_size) { in exfat_de_iter_init()
227 iter->de_file_offset = 0; in exfat_de_iter_init()
228 iter->next_read_offset = iter->read_size; in exfat_de_iter_init()
229 iter->max_skip_dentries = 0; in exfat_de_iter_init()
233 int exfat_de_iter_get(struct exfat_de_iter *iter, in exfat_de_iter_get() argument
240 next_de_file_offset = iter->de_file_offset + in exfat_de_iter_get()
242 block = (unsigned int)(next_de_file_offset / iter->read_size); in exfat_de_iter_get()
245 iter->parent->size) in exfat_de_iter_get()
248 if (block > iter->de_file_offset / iter->read_size + 1) in exfat_de_iter_get()
252 if (next_de_file_offset >= iter->next_read_offset) { in exfat_de_iter_get()
253 ret = read_block(iter, block); in exfat_de_iter_get()
254 if (ret != (ssize_t)iter->read_size) in exfat_de_iter_get()
256 iter->next_read_offset += iter->read_size; in exfat_de_iter_get()
259 if (ith + 1 > iter->max_skip_dentries) in exfat_de_iter_get()
260 iter->max_skip_dentries = ith + 1; in exfat_de_iter_get()
263 (iter->buffer_desc[block & 0x01].buffer + in exfat_de_iter_get()
264 next_de_file_offset % iter->read_size); in exfat_de_iter_get()
268 int exfat_de_iter_get_dirty(struct exfat_de_iter *iter, in exfat_de_iter_get_dirty() argument
275 ret = exfat_de_iter_get(iter, ith, dentry); in exfat_de_iter_get_dirty()
277 next_file_offset = iter->de_file_offset + in exfat_de_iter_get_dirty()
279 block = (unsigned int)(next_file_offset / iter->read_size); in exfat_de_iter_get_dirty()
280 sect_idx = (int)((next_file_offset % iter->read_size) / in exfat_de_iter_get_dirty()
281 iter->write_size); in exfat_de_iter_get_dirty()
282 iter->buffer_desc[block & 0x01].dirty[sect_idx] = 1; in exfat_de_iter_get_dirty()
288 int exfat_de_iter_flush(struct exfat_de_iter *iter) in exfat_de_iter_flush() argument
290 if (write_block(iter, 0) || write_block(iter, 1)) in exfat_de_iter_flush()
299 int exfat_de_iter_advance(struct exfat_de_iter *iter, int skip_dentries) in exfat_de_iter_advance() argument
301 if (skip_dentries != iter->max_skip_dentries) in exfat_de_iter_advance()
304 iter->max_skip_dentries = 0; in exfat_de_iter_advance()
305 iter->de_file_offset = iter->de_file_offset + in exfat_de_iter_advance()
310 off_t exfat_de_iter_file_offset(struct exfat_de_iter *iter) in exfat_de_iter_file_offset() argument
312 return iter->de_file_offset; in exfat_de_iter_file_offset()