zmap.c (47e4937a4a7ca4184fd282791dfee76c6799966a) zmap.c (8d8a09b093d7073465c824f74caf315c073d3875)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2018-2019 HUAWEI, Inc.
4 * http://www.huawei.com/
5 * Created by Gao Xiang <gaoxiang25@huawei.com>
6 */
7#include "internal.h"
8#include <asm/unaligned.h>

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

343 /* load extent head logical cluster if needed */
344 lcn -= lookback_distance;
345 err = vle_load_cluster_from_disk(m, lcn);
346 if (err)
347 return err;
348
349 switch (m->type) {
350 case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD:
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2018-2019 HUAWEI, Inc.
4 * http://www.huawei.com/
5 * Created by Gao Xiang <gaoxiang25@huawei.com>
6 */
7#include "internal.h"
8#include <asm/unaligned.h>

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

343 /* load extent head logical cluster if needed */
344 lcn -= lookback_distance;
345 err = vle_load_cluster_from_disk(m, lcn);
346 if (err)
347 return err;
348
349 switch (m->type) {
350 case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD:
351 if (unlikely(!m->delta[0])) {
351 if (!m->delta[0]) {
352 errln("invalid lookback distance 0 at nid %llu",
353 vi->nid);
354 DBG_BUGON(1);
355 return -EFSCORRUPTED;
356 }
357 return vle_extent_lookback(m, m->delta[0]);
358 case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN:
359 map->m_flags &= ~EROFS_MAP_ZIPPED;

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

381 };
382 int err = 0;
383 unsigned int lclusterbits, endoff;
384 unsigned long long ofs, end;
385
386 trace_z_erofs_map_blocks_iter_enter(inode, map, flags);
387
388 /* when trying to read beyond EOF, leave it unmapped */
352 errln("invalid lookback distance 0 at nid %llu",
353 vi->nid);
354 DBG_BUGON(1);
355 return -EFSCORRUPTED;
356 }
357 return vle_extent_lookback(m, m->delta[0]);
358 case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN:
359 map->m_flags &= ~EROFS_MAP_ZIPPED;

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

381 };
382 int err = 0;
383 unsigned int lclusterbits, endoff;
384 unsigned long long ofs, end;
385
386 trace_z_erofs_map_blocks_iter_enter(inode, map, flags);
387
388 /* when trying to read beyond EOF, leave it unmapped */
389 if (unlikely(map->m_la >= inode->i_size)) {
389 if (map->m_la >= inode->i_size) {
390 map->m_llen = map->m_la + 1 - inode->i_size;
391 map->m_la = inode->i_size;
392 map->m_flags = 0;
393 goto out;
394 }
395
396 err = fill_inode_lazy(inode);
397 if (err)

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

415 map->m_flags &= ~EROFS_MAP_ZIPPED;
416 /* fallthrough */
417 case Z_EROFS_VLE_CLUSTER_TYPE_HEAD:
418 if (endoff >= m.clusterofs) {
419 map->m_la = (m.lcn << lclusterbits) | m.clusterofs;
420 break;
421 }
422 /* m.lcn should be >= 1 if endoff < m.clusterofs */
390 map->m_llen = map->m_la + 1 - inode->i_size;
391 map->m_la = inode->i_size;
392 map->m_flags = 0;
393 goto out;
394 }
395
396 err = fill_inode_lazy(inode);
397 if (err)

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

415 map->m_flags &= ~EROFS_MAP_ZIPPED;
416 /* fallthrough */
417 case Z_EROFS_VLE_CLUSTER_TYPE_HEAD:
418 if (endoff >= m.clusterofs) {
419 map->m_la = (m.lcn << lclusterbits) | m.clusterofs;
420 break;
421 }
422 /* m.lcn should be >= 1 if endoff < m.clusterofs */
423 if (unlikely(!m.lcn)) {
423 if (!m.lcn) {
424 errln("invalid logical cluster 0 at nid %llu",
425 vi->nid);
426 err = -EFSCORRUPTED;
427 goto unmap_out;
428 }
429 end = (m.lcn << lclusterbits) | m.clusterofs;
430 map->m_flags |= EROFS_MAP_FULL_MAPPED;
431 m.delta[0] = 1;
432 /* fallthrough */
433 case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD:
434 /* get the correspoinding first chunk */
435 err = vle_extent_lookback(&m, m.delta[0]);
424 errln("invalid logical cluster 0 at nid %llu",
425 vi->nid);
426 err = -EFSCORRUPTED;
427 goto unmap_out;
428 }
429 end = (m.lcn << lclusterbits) | m.clusterofs;
430 map->m_flags |= EROFS_MAP_FULL_MAPPED;
431 m.delta[0] = 1;
432 /* fallthrough */
433 case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD:
434 /* get the correspoinding first chunk */
435 err = vle_extent_lookback(&m, m.delta[0]);
436 if (unlikely(err))
436 if (err)
437 goto unmap_out;
438 break;
439 default:
440 errln("unknown type %u at offset %llu of nid %llu",
441 m.type, ofs, vi->nid);
442 err = -EOPNOTSUPP;
443 goto unmap_out;
444 }

--- 22 unchanged lines hidden ---
437 goto unmap_out;
438 break;
439 default:
440 errln("unknown type %u at offset %llu of nid %llu",
441 m.type, ofs, vi->nid);
442 err = -EOPNOTSUPP;
443 goto unmap_out;
444 }

--- 22 unchanged lines hidden ---