• Home
  • Raw
  • Download

Lines Matching refs:f

69 static inline bool is_erasure(fec_handle *f, uint64_t offset,  in is_erasure()  argument
72 if (unlikely(offset >= f->data_size)) { in is_erasure()
82 return !verity_check_block(f, &f->verity.hash[n * SHA256_DIGEST_LENGTH], in is_erasure()
87 static inline bool is_zero(fec_handle *f, uint64_t offset) in is_zero() argument
89 verity_info *v = &f->verity; in is_zero()
91 if (!v->hash || unlikely(offset >= f->data_size)) { in is_zero()
107 static int __ecc_read(fec_handle *f, void *rs, uint8_t *dest, uint64_t offset, in __ecc_read() argument
111 ecc_info *e = &f->ecc; in __ecc_read()
122 check(!use_erasures || f->verity.hash); in __ecc_read()
136 if (likely(interleaved < e->start) && !is_zero(f, interleaved)) { in __ecc_read()
138 if (!raw_pread(f, bbuf, FEC_BLOCKSIZE, interleaved)) { in __ecc_read()
146 is_erasure(f, interleaved, bbuf)) { in __ecc_read()
163 if (!raw_pread(f, &ecc_data[i * FEC_RSM + e->rsn], e->roots, in __ecc_read()
183 } else if (!f->verity.hash) { in __ecc_read()
208 static int ecc_init(fec_handle *f, rs_unique_ptr& rs, in ecc_init() argument
211 check(f); in ecc_init()
213 rs.reset(init_rs_char(FEC_PARAMS(f->ecc.roots))); in ecc_init()
234 static ssize_t ecc_read(fec_handle *f, uint8_t *dest, size_t count, in ecc_read() argument
237 check(f); in ecc_read()
239 check(offset < f->data_size); in ecc_read()
240 check(offset + count <= f->data_size); in ecc_read()
248 if (ecc_init(f, rs, ecc_data) == -1) { in ecc_read()
260 if (__ecc_read(f, rs.get(), data, curr * FEC_BLOCKSIZE, false, in ecc_read()
285 static ssize_t verity_read(fec_handle *f, uint8_t *dest, size_t count, in verity_read() argument
288 check(f); in verity_read()
290 check(offset < f->data_size); in verity_read()
291 check(offset + count <= f->data_size); in verity_read()
292 check(f->verity.hash); in verity_read()
300 if (f->ecc.start && ecc_init(f, rs, ecc_data) == -1) { in verity_read()
309 uint64_t max_hash_block = (f->verity.hash_data_blocks * FEC_BLOCKSIZE - in verity_read()
315 uint8_t *hash = &f->verity.hash[curr * SHA256_DIGEST_LENGTH]; in verity_read()
318 bool expect_zeros = is_zero(f, curr_offset); in verity_read()
322 if ((f->mode & O_ACCMODE) == O_RDONLY && expect_zeros) { in verity_read()
328 if (!raw_pread(f, data, FEC_BLOCKSIZE, curr_offset)) { in verity_read()
333 if (likely(verity_check_block(f, hash, data))) { in verity_read()
344 if (!f->ecc.start) { in verity_read()
356 if (__ecc_read(f, rs.get(), data, curr_offset, false, ecc_data.get(), in verity_read()
358 verity_check_block(f, hash, data)) { in verity_read()
363 if (__ecc_read(f, rs.get(), data, curr_offset, true, ecc_data.get(), in verity_read()
365 verity_check_block(f, hash, data)) { in verity_read()
379 if (f->mode & O_RDWR && in verity_read()
380 !raw_pwrite(f, data, FEC_BLOCKSIZE, curr_offset)) { in verity_read()
404 int fec_seek(struct fec_handle *f, int64_t offset, int whence) in fec_seek() argument
406 check(f); in fec_seek()
414 f->pos = offset; in fec_seek()
416 if (offset < 0 && f->pos < (uint64_t)-offset) { in fec_seek()
419 } else if (offset > 0 && (uint64_t)offset > UINT64_MAX - f->pos) { in fec_seek()
424 f->pos += offset; in fec_seek()
429 } else if ((uint64_t)-offset > f->size) { in fec_seek()
434 f->pos = f->size + offset; in fec_seek()
445 ssize_t fec_read(struct fec_handle *f, void *buf, size_t count) in fec_read() argument
447 ssize_t rc = fec_pread(f, buf, count, f->pos); in fec_read()
450 check(f->pos < UINT64_MAX - rc); in fec_read()
451 f->pos += rc; in fec_read()
472 bool raw_pread(fec_handle *f, void *buf, size_t count, uint64_t offset) in raw_pread() argument
474 check(f); in raw_pread()
481 ssize_t n = TEMP_FAILURE_RETRY(pread64(f->fd, p, remaining, offset)); in raw_pread()
496 bool raw_pwrite(fec_handle *f, const void *buf, size_t count, uint64_t offset) in raw_pwrite() argument
498 check(f); in raw_pwrite()
505 ssize_t n = TEMP_FAILURE_RETRY(pwrite64(f->fd, p, remaining, offset)); in raw_pwrite()
521 ssize_t fec_pread(struct fec_handle *f, void *buf, size_t count, in fec_pread() argument
524 check(f); in fec_pread()
532 if (f->verity.hash) { in fec_pread()
533 return process(f, (uint8_t *)buf, in fec_pread()
534 get_max_count(offset, count, f->data_size), offset, in fec_pread()
536 } else if (f->ecc.start) { in fec_pread()
537 check(f->ecc.start < f->size); in fec_pread()
539 count = get_max_count(offset, count, f->data_size); in fec_pread()
540 ssize_t rc = process(f, (uint8_t *)buf, count, offset, ecc_read); in fec_pread()
549 count = get_max_count(offset, count, f->size); in fec_pread()
552 if (raw_pread(f, buf, count, offset)) { in fec_pread()