zmap.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2018-2019 HUAWEI, Inc.
  4. * https://www.huawei.com/
  5. */
  6. #include "internal.h"
  7. #include <linux/unaligned.h>
  8. #include <trace/events/erofs.h>
  9. struct z_erofs_maprecorder {
  10. struct inode *inode;
  11. struct erofs_map_blocks *map;
  12. unsigned long lcn;
  13. /* compression extent information gathered */
  14. u8 type, headtype;
  15. u16 clusterofs;
  16. u16 delta[2];
  17. erofs_blk_t pblk, compressedblks;
  18. erofs_off_t nextpackoff;
  19. bool partialref;
  20. };
  21. static int z_erofs_load_full_lcluster(struct z_erofs_maprecorder *m,
  22. unsigned long lcn)
  23. {
  24. struct inode *const inode = m->inode;
  25. struct erofs_inode *const vi = EROFS_I(inode);
  26. const erofs_off_t pos = Z_EROFS_FULL_INDEX_ALIGN(erofs_iloc(inode) +
  27. vi->inode_isize + vi->xattr_isize) +
  28. lcn * sizeof(struct z_erofs_lcluster_index);
  29. struct z_erofs_lcluster_index *di;
  30. unsigned int advise;
  31. di = erofs_read_metabuf(&m->map->buf, inode->i_sb, pos, EROFS_KMAP);
  32. if (IS_ERR(di))
  33. return PTR_ERR(di);
  34. m->lcn = lcn;
  35. m->nextpackoff = pos + sizeof(struct z_erofs_lcluster_index);
  36. advise = le16_to_cpu(di->di_advise);
  37. m->type = advise & Z_EROFS_LI_LCLUSTER_TYPE_MASK;
  38. if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
  39. m->clusterofs = 1 << vi->z_logical_clusterbits;
  40. m->delta[0] = le16_to_cpu(di->di_u.delta[0]);
  41. if (m->delta[0] & Z_EROFS_LI_D0_CBLKCNT) {
  42. if (!(vi->z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 |
  43. Z_EROFS_ADVISE_BIG_PCLUSTER_2))) {
  44. DBG_BUGON(1);
  45. return -EFSCORRUPTED;
  46. }
  47. m->compressedblks = m->delta[0] & ~Z_EROFS_LI_D0_CBLKCNT;
  48. m->delta[0] = 1;
  49. }
  50. m->delta[1] = le16_to_cpu(di->di_u.delta[1]);
  51. } else {
  52. m->partialref = !!(advise & Z_EROFS_LI_PARTIAL_REF);
  53. m->clusterofs = le16_to_cpu(di->di_clusterofs);
  54. if (m->clusterofs >= 1 << vi->z_logical_clusterbits) {
  55. DBG_BUGON(1);
  56. return -EFSCORRUPTED;
  57. }
  58. m->pblk = le32_to_cpu(di->di_u.blkaddr);
  59. }
  60. return 0;
  61. }
  62. static unsigned int decode_compactedbits(unsigned int lobits,
  63. u8 *in, unsigned int pos, u8 *type)
  64. {
  65. const unsigned int v = get_unaligned_le32(in + pos / 8) >> (pos & 7);
  66. const unsigned int lo = v & ((1 << lobits) - 1);
  67. *type = (v >> lobits) & 3;
  68. return lo;
  69. }
  70. static int get_compacted_la_distance(unsigned int lobits,
  71. unsigned int encodebits,
  72. unsigned int vcnt, u8 *in, int i)
  73. {
  74. unsigned int lo, d1 = 0;
  75. u8 type;
  76. DBG_BUGON(i >= vcnt);
  77. do {
  78. lo = decode_compactedbits(lobits, in, encodebits * i, &type);
  79. if (type != Z_EROFS_LCLUSTER_TYPE_NONHEAD)
  80. return d1;
  81. ++d1;
  82. } while (++i < vcnt);
  83. /* vcnt - 1 (Z_EROFS_LCLUSTER_TYPE_NONHEAD) item */
  84. if (!(lo & Z_EROFS_LI_D0_CBLKCNT))
  85. d1 += lo - 1;
  86. return d1;
  87. }
  88. static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m,
  89. unsigned long lcn, bool lookahead)
  90. {
  91. struct inode *const inode = m->inode;
  92. struct erofs_inode *const vi = EROFS_I(inode);
  93. const erofs_off_t ebase = sizeof(struct z_erofs_map_header) +
  94. ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
  95. const unsigned int lclusterbits = vi->z_logical_clusterbits;
  96. const unsigned int totalidx = erofs_iblks(inode);
  97. unsigned int compacted_4b_initial, compacted_2b, amortizedshift;
  98. unsigned int vcnt, lo, lobits, encodebits, nblk, bytes;
  99. bool big_pcluster = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1;
  100. erofs_off_t pos;
  101. u8 *in, type;
  102. int i;
  103. if (lcn >= totalidx || lclusterbits > 14)
  104. return -EINVAL;
  105. m->lcn = lcn;
  106. /* used to align to 32-byte (compacted_2b) alignment */
  107. compacted_4b_initial = ((32 - ebase % 32) / 4) & 7;
  108. compacted_2b = 0;
  109. if ((vi->z_advise & Z_EROFS_ADVISE_COMPACTED_2B) &&
  110. compacted_4b_initial < totalidx)
  111. compacted_2b = rounddown(totalidx - compacted_4b_initial, 16);
  112. pos = ebase;
  113. amortizedshift = 2; /* compact_4b */
  114. if (lcn >= compacted_4b_initial) {
  115. pos += compacted_4b_initial * 4;
  116. lcn -= compacted_4b_initial;
  117. if (lcn < compacted_2b) {
  118. amortizedshift = 1;
  119. } else {
  120. pos += compacted_2b * 2;
  121. lcn -= compacted_2b;
  122. }
  123. }
  124. pos += lcn * (1 << amortizedshift);
  125. /* figure out the lcluster count in this pack */
  126. if (1 << amortizedshift == 4 && lclusterbits <= 14)
  127. vcnt = 2;
  128. else if (1 << amortizedshift == 2 && lclusterbits <= 12)
  129. vcnt = 16;
  130. else
  131. return -EOPNOTSUPP;
  132. in = erofs_read_metabuf(&m->map->buf, m->inode->i_sb, pos, EROFS_KMAP);
  133. if (IS_ERR(in))
  134. return PTR_ERR(in);
  135. /* it doesn't equal to round_up(..) */
  136. m->nextpackoff = round_down(pos, vcnt << amortizedshift) +
  137. (vcnt << amortizedshift);
  138. lobits = max(lclusterbits, ilog2(Z_EROFS_LI_D0_CBLKCNT) + 1U);
  139. encodebits = ((vcnt << amortizedshift) - sizeof(__le32)) * 8 / vcnt;
  140. bytes = pos & ((vcnt << amortizedshift) - 1);
  141. in -= bytes;
  142. i = bytes >> amortizedshift;
  143. lo = decode_compactedbits(lobits, in, encodebits * i, &type);
  144. m->type = type;
  145. if (type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
  146. m->clusterofs = 1 << lclusterbits;
  147. /* figure out lookahead_distance: delta[1] if needed */
  148. if (lookahead)
  149. m->delta[1] = get_compacted_la_distance(lobits,
  150. encodebits, vcnt, in, i);
  151. if (lo & Z_EROFS_LI_D0_CBLKCNT) {
  152. if (!big_pcluster) {
  153. DBG_BUGON(1);
  154. return -EFSCORRUPTED;
  155. }
  156. m->compressedblks = lo & ~Z_EROFS_LI_D0_CBLKCNT;
  157. m->delta[0] = 1;
  158. return 0;
  159. } else if (i + 1 != (int)vcnt) {
  160. m->delta[0] = lo;
  161. return 0;
  162. }
  163. /*
  164. * since the last lcluster in the pack is special,
  165. * of which lo saves delta[1] rather than delta[0].
  166. * Hence, get delta[0] by the previous lcluster indirectly.
  167. */
  168. lo = decode_compactedbits(lobits, in,
  169. encodebits * (i - 1), &type);
  170. if (type != Z_EROFS_LCLUSTER_TYPE_NONHEAD)
  171. lo = 0;
  172. else if (lo & Z_EROFS_LI_D0_CBLKCNT)
  173. lo = 1;
  174. m->delta[0] = lo + 1;
  175. return 0;
  176. }
  177. m->clusterofs = lo;
  178. m->delta[0] = 0;
  179. /* figout out blkaddr (pblk) for HEAD lclusters */
  180. if (!big_pcluster) {
  181. nblk = 1;
  182. while (i > 0) {
  183. --i;
  184. lo = decode_compactedbits(lobits, in,
  185. encodebits * i, &type);
  186. if (type == Z_EROFS_LCLUSTER_TYPE_NONHEAD)
  187. i -= lo;
  188. if (i >= 0)
  189. ++nblk;
  190. }
  191. } else {
  192. nblk = 0;
  193. while (i > 0) {
  194. --i;
  195. lo = decode_compactedbits(lobits, in,
  196. encodebits * i, &type);
  197. if (type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
  198. if (lo & Z_EROFS_LI_D0_CBLKCNT) {
  199. --i;
  200. nblk += lo & ~Z_EROFS_LI_D0_CBLKCNT;
  201. continue;
  202. }
  203. /* bigpcluster shouldn't have plain d0 == 1 */
  204. if (lo <= 1) {
  205. DBG_BUGON(1);
  206. return -EFSCORRUPTED;
  207. }
  208. i -= lo - 2;
  209. continue;
  210. }
  211. ++nblk;
  212. }
  213. }
  214. in += (vcnt << amortizedshift) - sizeof(__le32);
  215. m->pblk = le32_to_cpu(*(__le32 *)in) + nblk;
  216. return 0;
  217. }
  218. static int z_erofs_load_lcluster_from_disk(struct z_erofs_maprecorder *m,
  219. unsigned int lcn, bool lookahead)
  220. {
  221. switch (EROFS_I(m->inode)->datalayout) {
  222. case EROFS_INODE_COMPRESSED_FULL:
  223. return z_erofs_load_full_lcluster(m, lcn);
  224. case EROFS_INODE_COMPRESSED_COMPACT:
  225. return z_erofs_load_compact_lcluster(m, lcn, lookahead);
  226. default:
  227. return -EINVAL;
  228. }
  229. }
  230. static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m,
  231. unsigned int lookback_distance)
  232. {
  233. struct super_block *sb = m->inode->i_sb;
  234. struct erofs_inode *const vi = EROFS_I(m->inode);
  235. const unsigned int lclusterbits = vi->z_logical_clusterbits;
  236. while (m->lcn >= lookback_distance) {
  237. unsigned long lcn = m->lcn - lookback_distance;
  238. int err;
  239. err = z_erofs_load_lcluster_from_disk(m, lcn, false);
  240. if (err)
  241. return err;
  242. if (m->type >= Z_EROFS_LCLUSTER_TYPE_MAX) {
  243. erofs_err(sb, "unknown type %u @ lcn %lu of nid %llu",
  244. m->type, lcn, vi->nid);
  245. DBG_BUGON(1);
  246. return -EOPNOTSUPP;
  247. } else if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
  248. lookback_distance = m->delta[0];
  249. if (!lookback_distance)
  250. break;
  251. continue;
  252. } else {
  253. m->headtype = m->type;
  254. m->map->m_la = (lcn << lclusterbits) | m->clusterofs;
  255. return 0;
  256. }
  257. }
  258. erofs_err(sb, "bogus lookback distance %u @ lcn %lu of nid %llu",
  259. lookback_distance, m->lcn, vi->nid);
  260. DBG_BUGON(1);
  261. return -EFSCORRUPTED;
  262. }
  263. static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m,
  264. unsigned int initial_lcn)
  265. {
  266. struct inode *inode = m->inode;
  267. struct super_block *sb = inode->i_sb;
  268. struct erofs_inode *vi = EROFS_I(inode);
  269. bool bigpcl1 = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1;
  270. bool bigpcl2 = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_2;
  271. unsigned long lcn = m->lcn + 1;
  272. int err;
  273. DBG_BUGON(m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD);
  274. DBG_BUGON(m->type != m->headtype);
  275. if ((m->headtype == Z_EROFS_LCLUSTER_TYPE_HEAD1 && !bigpcl1) ||
  276. ((m->headtype == Z_EROFS_LCLUSTER_TYPE_PLAIN ||
  277. m->headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2) && !bigpcl2) ||
  278. (lcn << vi->z_logical_clusterbits) >= inode->i_size)
  279. m->compressedblks = 1;
  280. if (m->compressedblks)
  281. goto out;
  282. err = z_erofs_load_lcluster_from_disk(m, lcn, false);
  283. if (err)
  284. return err;
  285. /*
  286. * If the 1st NONHEAD lcluster has already been handled initially w/o
  287. * valid compressedblks, which means at least it mustn't be CBLKCNT, or
  288. * an internal implemenatation error is detected.
  289. *
  290. * The following code can also handle it properly anyway, but let's
  291. * BUG_ON in the debugging mode only for developers to notice that.
  292. */
  293. DBG_BUGON(lcn == initial_lcn &&
  294. m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD);
  295. if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
  296. if (m->delta[0] != 1) {
  297. erofs_err(sb, "bogus CBLKCNT @ lcn %lu of nid %llu", lcn, vi->nid);
  298. DBG_BUGON(1);
  299. return -EFSCORRUPTED;
  300. }
  301. if (m->compressedblks)
  302. goto out;
  303. } else if (m->type < Z_EROFS_LCLUSTER_TYPE_MAX) {
  304. /*
  305. * if the 1st NONHEAD lcluster is actually PLAIN or HEAD type
  306. * rather than CBLKCNT, it's a 1 block-sized pcluster.
  307. */
  308. m->compressedblks = 1;
  309. goto out;
  310. }
  311. erofs_err(sb, "cannot found CBLKCNT @ lcn %lu of nid %llu", lcn, vi->nid);
  312. DBG_BUGON(1);
  313. return -EFSCORRUPTED;
  314. out:
  315. m->map->m_plen = erofs_pos(sb, m->compressedblks);
  316. return 0;
  317. }
  318. static int z_erofs_get_extent_decompressedlen(struct z_erofs_maprecorder *m)
  319. {
  320. struct inode *inode = m->inode;
  321. struct erofs_inode *vi = EROFS_I(inode);
  322. struct erofs_map_blocks *map = m->map;
  323. unsigned int lclusterbits = vi->z_logical_clusterbits;
  324. u64 lcn = m->lcn, headlcn = map->m_la >> lclusterbits;
  325. int err;
  326. while (1) {
  327. /* handle the last EOF pcluster (no next HEAD lcluster) */
  328. if ((lcn << lclusterbits) >= inode->i_size) {
  329. map->m_llen = inode->i_size - map->m_la;
  330. return 0;
  331. }
  332. err = z_erofs_load_lcluster_from_disk(m, lcn, true);
  333. if (err)
  334. return err;
  335. if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
  336. /* work around invalid d1 generated by pre-1.0 mkfs */
  337. if (unlikely(!m->delta[1])) {
  338. m->delta[1] = 1;
  339. DBG_BUGON(1);
  340. }
  341. } else if (m->type < Z_EROFS_LCLUSTER_TYPE_MAX) {
  342. if (lcn != headlcn)
  343. break; /* ends at the next HEAD lcluster */
  344. m->delta[1] = 1;
  345. } else {
  346. erofs_err(inode->i_sb, "unknown type %u @ lcn %llu of nid %llu",
  347. m->type, lcn, vi->nid);
  348. DBG_BUGON(1);
  349. return -EOPNOTSUPP;
  350. }
  351. lcn += m->delta[1];
  352. }
  353. map->m_llen = (lcn << lclusterbits) + m->clusterofs - map->m_la;
  354. return 0;
  355. }
  356. static int z_erofs_do_map_blocks(struct inode *inode,
  357. struct erofs_map_blocks *map, int flags)
  358. {
  359. struct erofs_inode *vi = EROFS_I(inode);
  360. struct super_block *sb = inode->i_sb;
  361. bool fragment = vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER;
  362. bool ztailpacking = vi->z_idata_size;
  363. struct z_erofs_maprecorder m = {
  364. .inode = inode,
  365. .map = map,
  366. };
  367. int err = 0;
  368. unsigned int lclusterbits, endoff, afmt;
  369. unsigned long initial_lcn;
  370. unsigned long long ofs, end;
  371. lclusterbits = vi->z_logical_clusterbits;
  372. ofs = flags & EROFS_GET_BLOCKS_FINDTAIL ? inode->i_size - 1 : map->m_la;
  373. initial_lcn = ofs >> lclusterbits;
  374. endoff = ofs & ((1 << lclusterbits) - 1);
  375. err = z_erofs_load_lcluster_from_disk(&m, initial_lcn, false);
  376. if (err)
  377. goto unmap_out;
  378. if ((flags & EROFS_GET_BLOCKS_FINDTAIL) && ztailpacking)
  379. vi->z_fragmentoff = m.nextpackoff;
  380. map->m_flags = EROFS_MAP_MAPPED | EROFS_MAP_ENCODED;
  381. end = (m.lcn + 1ULL) << lclusterbits;
  382. switch (m.type) {
  383. case Z_EROFS_LCLUSTER_TYPE_PLAIN:
  384. case Z_EROFS_LCLUSTER_TYPE_HEAD1:
  385. case Z_EROFS_LCLUSTER_TYPE_HEAD2:
  386. if (endoff >= m.clusterofs) {
  387. m.headtype = m.type;
  388. map->m_la = (m.lcn << lclusterbits) | m.clusterofs;
  389. /*
  390. * For ztailpacking files, in order to inline data more
  391. * effectively, special EOF lclusters are now supported
  392. * which can have three parts at most.
  393. */
  394. if (ztailpacking && end > inode->i_size)
  395. end = inode->i_size;
  396. break;
  397. }
  398. /* m.lcn should be >= 1 if endoff < m.clusterofs */
  399. if (!m.lcn) {
  400. erofs_err(sb, "invalid logical cluster 0 at nid %llu",
  401. vi->nid);
  402. err = -EFSCORRUPTED;
  403. goto unmap_out;
  404. }
  405. end = (m.lcn << lclusterbits) | m.clusterofs;
  406. map->m_flags |= EROFS_MAP_FULL_MAPPED;
  407. m.delta[0] = 1;
  408. fallthrough;
  409. case Z_EROFS_LCLUSTER_TYPE_NONHEAD:
  410. /* get the corresponding first chunk */
  411. err = z_erofs_extent_lookback(&m, m.delta[0]);
  412. if (err)
  413. goto unmap_out;
  414. break;
  415. default:
  416. erofs_err(sb, "unknown type %u @ offset %llu of nid %llu",
  417. m.type, ofs, vi->nid);
  418. err = -EOPNOTSUPP;
  419. goto unmap_out;
  420. }
  421. if (m.partialref)
  422. map->m_flags |= EROFS_MAP_PARTIAL_REF;
  423. map->m_llen = end - map->m_la;
  424. if (flags & EROFS_GET_BLOCKS_FINDTAIL) {
  425. vi->z_tailextent_headlcn = m.lcn;
  426. /* for non-compact indexes, fragmentoff is 64 bits */
  427. if (fragment && vi->datalayout == EROFS_INODE_COMPRESSED_FULL)
  428. vi->z_fragmentoff |= (u64)m.pblk << 32;
  429. }
  430. if (ztailpacking && m.lcn == vi->z_tailextent_headlcn) {
  431. map->m_flags |= EROFS_MAP_META;
  432. map->m_pa = vi->z_fragmentoff;
  433. map->m_plen = vi->z_idata_size;
  434. if (erofs_blkoff(sb, map->m_pa) + map->m_plen > sb->s_blocksize) {
  435. erofs_err(sb, "invalid tail-packing pclustersize %llu",
  436. map->m_plen);
  437. err = -EFSCORRUPTED;
  438. goto unmap_out;
  439. }
  440. } else if (fragment && m.lcn == vi->z_tailextent_headlcn) {
  441. map->m_flags = EROFS_MAP_FRAGMENT;
  442. } else {
  443. map->m_pa = erofs_pos(sb, m.pblk);
  444. err = z_erofs_get_extent_compressedlen(&m, initial_lcn);
  445. if (err)
  446. goto unmap_out;
  447. }
  448. if (m.headtype == Z_EROFS_LCLUSTER_TYPE_PLAIN) {
  449. if (map->m_llen > map->m_plen) {
  450. DBG_BUGON(1);
  451. err = -EFSCORRUPTED;
  452. goto unmap_out;
  453. }
  454. afmt = vi->z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER ?
  455. Z_EROFS_COMPRESSION_INTERLACED :
  456. Z_EROFS_COMPRESSION_SHIFTED;
  457. } else {
  458. afmt = m.headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2 ?
  459. vi->z_algorithmtype[1] : vi->z_algorithmtype[0];
  460. if (!(EROFS_I_SB(inode)->available_compr_algs & (1 << afmt))) {
  461. erofs_err(sb, "inconsistent algorithmtype %u for nid %llu",
  462. afmt, vi->nid);
  463. err = -EFSCORRUPTED;
  464. goto unmap_out;
  465. }
  466. }
  467. map->m_algorithmformat = afmt;
  468. if ((flags & EROFS_GET_BLOCKS_FIEMAP) ||
  469. ((flags & EROFS_GET_BLOCKS_READMORE) &&
  470. (map->m_algorithmformat == Z_EROFS_COMPRESSION_LZMA ||
  471. map->m_algorithmformat == Z_EROFS_COMPRESSION_DEFLATE ||
  472. map->m_algorithmformat == Z_EROFS_COMPRESSION_ZSTD) &&
  473. map->m_llen >= i_blocksize(inode))) {
  474. err = z_erofs_get_extent_decompressedlen(&m);
  475. if (!err)
  476. map->m_flags |= EROFS_MAP_FULL_MAPPED;
  477. }
  478. unmap_out:
  479. erofs_unmap_metabuf(&m.map->buf);
  480. return err;
  481. }
  482. static int z_erofs_fill_inode_lazy(struct inode *inode)
  483. {
  484. struct erofs_inode *const vi = EROFS_I(inode);
  485. struct super_block *const sb = inode->i_sb;
  486. int err, headnr;
  487. erofs_off_t pos;
  488. struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
  489. struct z_erofs_map_header *h;
  490. if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags)) {
  491. /*
  492. * paired with smp_mb() at the end of the function to ensure
  493. * fields will only be observed after the bit is set.
  494. */
  495. smp_mb();
  496. return 0;
  497. }
  498. if (wait_on_bit_lock(&vi->flags, EROFS_I_BL_Z_BIT, TASK_KILLABLE))
  499. return -ERESTARTSYS;
  500. err = 0;
  501. if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags))
  502. goto out_unlock;
  503. pos = ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
  504. h = erofs_read_metabuf(&buf, sb, pos, EROFS_KMAP);
  505. if (IS_ERR(h)) {
  506. err = PTR_ERR(h);
  507. goto out_unlock;
  508. }
  509. /*
  510. * if the highest bit of the 8-byte map header is set, the whole file
  511. * is stored in the packed inode. The rest bits keeps z_fragmentoff.
  512. */
  513. if (h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT) {
  514. vi->z_advise = Z_EROFS_ADVISE_FRAGMENT_PCLUSTER;
  515. vi->z_fragmentoff = le64_to_cpu(*(__le64 *)h) ^ (1ULL << 63);
  516. vi->z_tailextent_headlcn = 0;
  517. goto done;
  518. }
  519. vi->z_advise = le16_to_cpu(h->h_advise);
  520. vi->z_algorithmtype[0] = h->h_algorithmtype & 15;
  521. vi->z_algorithmtype[1] = h->h_algorithmtype >> 4;
  522. if (vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER)
  523. vi->z_fragmentoff = le32_to_cpu(h->h_fragmentoff);
  524. else if (vi->z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER)
  525. vi->z_idata_size = le16_to_cpu(h->h_idata_size);
  526. headnr = 0;
  527. if (vi->z_algorithmtype[0] >= Z_EROFS_COMPRESSION_MAX ||
  528. vi->z_algorithmtype[++headnr] >= Z_EROFS_COMPRESSION_MAX) {
  529. erofs_err(sb, "unknown HEAD%u format %u for nid %llu, please upgrade kernel",
  530. headnr + 1, vi->z_algorithmtype[headnr], vi->nid);
  531. err = -EOPNOTSUPP;
  532. goto out_put_metabuf;
  533. }
  534. vi->z_logical_clusterbits = sb->s_blocksize_bits + (h->h_clusterbits & 7);
  535. if (!erofs_sb_has_big_pcluster(EROFS_SB(sb)) &&
  536. vi->z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 |
  537. Z_EROFS_ADVISE_BIG_PCLUSTER_2)) {
  538. erofs_err(sb, "per-inode big pcluster without sb feature for nid %llu",
  539. vi->nid);
  540. err = -EFSCORRUPTED;
  541. goto out_put_metabuf;
  542. }
  543. if (vi->datalayout == EROFS_INODE_COMPRESSED_COMPACT &&
  544. !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1) ^
  545. !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_2)) {
  546. erofs_err(sb, "big pcluster head1/2 of compact indexes should be consistent for nid %llu",
  547. vi->nid);
  548. err = -EFSCORRUPTED;
  549. goto out_put_metabuf;
  550. }
  551. if (vi->z_idata_size ||
  552. (vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER)) {
  553. struct erofs_map_blocks map = {
  554. .buf = __EROFS_BUF_INITIALIZER
  555. };
  556. err = z_erofs_do_map_blocks(inode, &map,
  557. EROFS_GET_BLOCKS_FINDTAIL);
  558. erofs_put_metabuf(&map.buf);
  559. if (err < 0)
  560. goto out_put_metabuf;
  561. }
  562. done:
  563. /* paired with smp_mb() at the beginning of the function */
  564. smp_mb();
  565. set_bit(EROFS_I_Z_INITED_BIT, &vi->flags);
  566. out_put_metabuf:
  567. erofs_put_metabuf(&buf);
  568. out_unlock:
  569. clear_and_wake_up_bit(EROFS_I_BL_Z_BIT, &vi->flags);
  570. return err;
  571. }
  572. int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map,
  573. int flags)
  574. {
  575. struct erofs_inode *const vi = EROFS_I(inode);
  576. int err = 0;
  577. trace_erofs_map_blocks_enter(inode, map, flags);
  578. if (map->m_la >= inode->i_size) { /* post-EOF unmapped extent */
  579. map->m_llen = map->m_la + 1 - inode->i_size;
  580. map->m_la = inode->i_size;
  581. map->m_flags = 0;
  582. } else {
  583. err = z_erofs_fill_inode_lazy(inode);
  584. if (!err) {
  585. if ((vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER) &&
  586. !vi->z_tailextent_headlcn) {
  587. map->m_la = 0;
  588. map->m_llen = inode->i_size;
  589. map->m_flags = EROFS_MAP_FRAGMENT;
  590. } else {
  591. err = z_erofs_do_map_blocks(inode, map, flags);
  592. }
  593. }
  594. if (!err && (map->m_flags & EROFS_MAP_ENCODED) &&
  595. unlikely(map->m_plen > Z_EROFS_PCLUSTER_MAX_SIZE ||
  596. map->m_llen > Z_EROFS_PCLUSTER_MAX_DSIZE))
  597. err = -EOPNOTSUPP;
  598. if (err)
  599. map->m_llen = 0;
  600. }
  601. trace_erofs_map_blocks_exit(inode, map, flags, err);
  602. return err;
  603. }
  604. static int z_erofs_iomap_begin_report(struct inode *inode, loff_t offset,
  605. loff_t length, unsigned int flags,
  606. struct iomap *iomap, struct iomap *srcmap)
  607. {
  608. int ret;
  609. struct erofs_map_blocks map = { .m_la = offset };
  610. ret = z_erofs_map_blocks_iter(inode, &map, EROFS_GET_BLOCKS_FIEMAP);
  611. erofs_put_metabuf(&map.buf);
  612. if (ret < 0)
  613. return ret;
  614. iomap->bdev = inode->i_sb->s_bdev;
  615. iomap->offset = map.m_la;
  616. iomap->length = map.m_llen;
  617. if (map.m_flags & EROFS_MAP_MAPPED) {
  618. iomap->type = IOMAP_MAPPED;
  619. iomap->addr = map.m_flags & __EROFS_MAP_FRAGMENT ?
  620. IOMAP_NULL_ADDR : map.m_pa;
  621. } else {
  622. iomap->type = IOMAP_HOLE;
  623. iomap->addr = IOMAP_NULL_ADDR;
  624. /*
  625. * No strict rule on how to describe extents for post EOF, yet
  626. * we need to do like below. Otherwise, iomap itself will get
  627. * into an endless loop on post EOF.
  628. *
  629. * Calculate the effective offset by subtracting extent start
  630. * (map.m_la) from the requested offset, and add it to length.
  631. * (NB: offset >= map.m_la always)
  632. */
  633. if (iomap->offset >= inode->i_size)
  634. iomap->length = length + offset - map.m_la;
  635. }
  636. iomap->flags = 0;
  637. return 0;
  638. }
  639. const struct iomap_ops z_erofs_iomap_report_ops = {
  640. .iomap_begin = z_erofs_iomap_begin_report,
  641. };