0019-kern-file-Implement-filesystem-reference-counting.patch 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. From a27c4b6da2f4a014e5d096e75790e860bcdb2472 Mon Sep 17 00:00:00 2001
  2. From: B Horn <b@horn.uk>
  3. Date: Sun, 12 May 2024 10:15:03 +0100
  4. Subject: [PATCH] kern/file: Implement filesystem reference counting
  5. The grub_file_open() and grub_file_close() should be the only places
  6. that allow a reference to a filesystem to stay open. So, add grub_dl_t
  7. to grub_fs_t and set this in the GRUB_MOD_INIT() for each filesystem to
  8. avoid issues when filesystems forget to do it themselves or do not track
  9. their own references, e.g. squash4.
  10. The fs_label(), fs_uuid(), fs_mtime() and fs_read() should all ref and
  11. unref in the same function but it is essentially redundant in GRUB
  12. single threaded model.
  13. Signed-off-by: B Horn <b@horn.uk>
  14. Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
  15. Conflicts:
  16. grub-core/fs/erofs.c
  17. Upstream: 16f196874fbe360a1b3c66064ec15adadf94c57b
  18. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
  19. ---
  20. grub-core/fs/affs.c | 1 +
  21. grub-core/fs/bfs.c | 1 +
  22. grub-core/fs/btrfs.c | 1 +
  23. grub-core/fs/cbfs.c | 1 +
  24. grub-core/fs/cpio.c | 1 +
  25. grub-core/fs/cpio_be.c | 1 +
  26. grub-core/fs/ext2.c | 1 +
  27. grub-core/fs/f2fs.c | 1 +
  28. grub-core/fs/fat.c | 1 +
  29. grub-core/fs/hfs.c | 1 +
  30. grub-core/fs/hfsplus.c | 1 +
  31. grub-core/fs/iso9660.c | 1 +
  32. grub-core/fs/jfs.c | 1 +
  33. grub-core/fs/minix.c | 1 +
  34. grub-core/fs/newc.c | 1 +
  35. grub-core/fs/nilfs2.c | 1 +
  36. grub-core/fs/ntfs.c | 1 +
  37. grub-core/fs/odc.c | 1 +
  38. grub-core/fs/proc.c | 1 +
  39. grub-core/fs/reiserfs.c | 1 +
  40. grub-core/fs/romfs.c | 1 +
  41. grub-core/fs/sfs.c | 1 +
  42. grub-core/fs/squash4.c | 1 +
  43. grub-core/fs/tar.c | 1 +
  44. grub-core/fs/udf.c | 1 +
  45. grub-core/fs/ufs.c | 1 +
  46. grub-core/fs/xfs.c | 1 +
  47. grub-core/fs/zfs/zfs.c | 1 +
  48. grub-core/kern/file.c | 7 +++++++
  49. include/grub/fs.h | 4 ++++
  50. 30 files changed, 39 insertions(+)
  51. diff --git a/grub-core/fs/affs.c b/grub-core/fs/affs.c
  52. index ed606b3f1..9b0afb954 100644
  53. --- a/grub-core/fs/affs.c
  54. +++ b/grub-core/fs/affs.c
  55. @@ -703,6 +703,7 @@ static struct grub_fs grub_affs_fs =
  56. GRUB_MOD_INIT(affs)
  57. {
  58. + grub_affs_fs.mod = mod;
  59. grub_fs_register (&grub_affs_fs);
  60. my_mod = mod;
  61. }
  62. diff --git a/grub-core/fs/bfs.c b/grub-core/fs/bfs.c
  63. index 07cb3e3ac..f37b16895 100644
  64. --- a/grub-core/fs/bfs.c
  65. +++ b/grub-core/fs/bfs.c
  66. @@ -1106,6 +1106,7 @@ GRUB_MOD_INIT (bfs)
  67. {
  68. COMPILE_TIME_ASSERT (1 << LOG_EXTENT_SIZE ==
  69. sizeof (struct grub_bfs_extent));
  70. + grub_bfs_fs.mod = mod;
  71. grub_fs_register (&grub_bfs_fs);
  72. }
  73. diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
  74. index ba0c58352..aae81482b 100644
  75. --- a/grub-core/fs/btrfs.c
  76. +++ b/grub-core/fs/btrfs.c
  77. @@ -2413,6 +2413,7 @@ static struct grub_fs grub_btrfs_fs = {
  78. GRUB_MOD_INIT (btrfs)
  79. {
  80. + grub_btrfs_fs.mod = mod;
  81. grub_fs_register (&grub_btrfs_fs);
  82. }
  83. diff --git a/grub-core/fs/cbfs.c b/grub-core/fs/cbfs.c
  84. index 8ab7106af..2332745fe 100644
  85. --- a/grub-core/fs/cbfs.c
  86. +++ b/grub-core/fs/cbfs.c
  87. @@ -390,6 +390,7 @@ GRUB_MOD_INIT (cbfs)
  88. #if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
  89. init_cbfsdisk ();
  90. #endif
  91. + grub_cbfs_fs.mod = mod;
  92. grub_fs_register (&grub_cbfs_fs);
  93. }
  94. diff --git a/grub-core/fs/cpio.c b/grub-core/fs/cpio.c
  95. index dab5f9898..1799f7ff5 100644
  96. --- a/grub-core/fs/cpio.c
  97. +++ b/grub-core/fs/cpio.c
  98. @@ -52,6 +52,7 @@ read_number (const grub_uint16_t *arr, grub_size_t size)
  99. GRUB_MOD_INIT (cpio)
  100. {
  101. + grub_cpio_fs.mod = mod;
  102. grub_fs_register (&grub_cpio_fs);
  103. }
  104. diff --git a/grub-core/fs/cpio_be.c b/grub-core/fs/cpio_be.c
  105. index 846548892..7bed1b848 100644
  106. --- a/grub-core/fs/cpio_be.c
  107. +++ b/grub-core/fs/cpio_be.c
  108. @@ -52,6 +52,7 @@ read_number (const grub_uint16_t *arr, grub_size_t size)
  109. GRUB_MOD_INIT (cpio_be)
  110. {
  111. + grub_cpio_fs.mod = mod;
  112. grub_fs_register (&grub_cpio_fs);
  113. }
  114. diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c
  115. index 3f9f6b208..c3058f7e7 100644
  116. --- a/grub-core/fs/ext2.c
  117. +++ b/grub-core/fs/ext2.c
  118. @@ -1131,6 +1131,7 @@ static struct grub_fs grub_ext2_fs =
  119. GRUB_MOD_INIT(ext2)
  120. {
  121. + grub_ext2_fs.mod = mod;
  122. grub_fs_register (&grub_ext2_fs);
  123. my_mod = mod;
  124. }
  125. diff --git a/grub-core/fs/f2fs.c b/grub-core/fs/f2fs.c
  126. index db8a65f8d..f6d6beaa5 100644
  127. --- a/grub-core/fs/f2fs.c
  128. +++ b/grub-core/fs/f2fs.c
  129. @@ -1353,6 +1353,7 @@ static struct grub_fs grub_f2fs_fs = {
  130. GRUB_MOD_INIT (f2fs)
  131. {
  132. + grub_f2fs_fs.mod = mod;
  133. grub_fs_register (&grub_f2fs_fs);
  134. my_mod = mod;
  135. }
  136. diff --git a/grub-core/fs/fat.c b/grub-core/fs/fat.c
  137. index c5efed724..6e62b915d 100644
  138. --- a/grub-core/fs/fat.c
  139. +++ b/grub-core/fs/fat.c
  140. @@ -1312,6 +1312,7 @@ GRUB_MOD_INIT(fat)
  141. #endif
  142. {
  143. COMPILE_TIME_ASSERT (sizeof (struct grub_fat_dir_entry) == 32);
  144. + grub_fat_fs.mod = mod;
  145. grub_fs_register (&grub_fat_fs);
  146. my_mod = mod;
  147. }
  148. diff --git a/grub-core/fs/hfs.c b/grub-core/fs/hfs.c
  149. index 920112b03..ce7581dd5 100644
  150. --- a/grub-core/fs/hfs.c
  151. +++ b/grub-core/fs/hfs.c
  152. @@ -1434,6 +1434,7 @@ static struct grub_fs grub_hfs_fs =
  153. GRUB_MOD_INIT(hfs)
  154. {
  155. + grub_hfs_fs.mod = mod;
  156. if (!grub_is_lockdown ())
  157. grub_fs_register (&grub_hfs_fs);
  158. my_mod = mod;
  159. diff --git a/grub-core/fs/hfsplus.c b/grub-core/fs/hfsplus.c
  160. index de71fd486..3f203abcc 100644
  161. --- a/grub-core/fs/hfsplus.c
  162. +++ b/grub-core/fs/hfsplus.c
  163. @@ -1176,6 +1176,7 @@ static struct grub_fs grub_hfsplus_fs =
  164. GRUB_MOD_INIT(hfsplus)
  165. {
  166. + grub_hfsplus_fs.mod = mod;
  167. grub_fs_register (&grub_hfsplus_fs);
  168. my_mod = mod;
  169. }
  170. diff --git a/grub-core/fs/iso9660.c b/grub-core/fs/iso9660.c
  171. index 8e3c95c4f..c73cb9ce0 100644
  172. --- a/grub-core/fs/iso9660.c
  173. +++ b/grub-core/fs/iso9660.c
  174. @@ -1260,6 +1260,7 @@ static struct grub_fs grub_iso9660_fs =
  175. GRUB_MOD_INIT(iso9660)
  176. {
  177. + grub_iso9660_fs.mod = mod;
  178. grub_fs_register (&grub_iso9660_fs);
  179. my_mod = mod;
  180. }
  181. diff --git a/grub-core/fs/jfs.c b/grub-core/fs/jfs.c
  182. index 70a2f4947..b0283ac00 100644
  183. --- a/grub-core/fs/jfs.c
  184. +++ b/grub-core/fs/jfs.c
  185. @@ -1005,6 +1005,7 @@ static struct grub_fs grub_jfs_fs =
  186. GRUB_MOD_INIT(jfs)
  187. {
  188. + grub_jfs_fs.mod = mod;
  189. grub_fs_register (&grub_jfs_fs);
  190. my_mod = mod;
  191. }
  192. diff --git a/grub-core/fs/minix.c b/grub-core/fs/minix.c
  193. index 5354951d1..b7679c3e2 100644
  194. --- a/grub-core/fs/minix.c
  195. +++ b/grub-core/fs/minix.c
  196. @@ -734,6 +734,7 @@ GRUB_MOD_INIT(minix)
  197. #endif
  198. #endif
  199. {
  200. + grub_minix_fs.mod = mod;
  201. grub_fs_register (&grub_minix_fs);
  202. my_mod = mod;
  203. }
  204. diff --git a/grub-core/fs/newc.c b/grub-core/fs/newc.c
  205. index 4fb8b2e3d..43b7f8b64 100644
  206. --- a/grub-core/fs/newc.c
  207. +++ b/grub-core/fs/newc.c
  208. @@ -64,6 +64,7 @@ read_number (const char *str, grub_size_t size)
  209. GRUB_MOD_INIT (newc)
  210. {
  211. + grub_cpio_fs.mod = mod;
  212. grub_fs_register (&grub_cpio_fs);
  213. }
  214. diff --git a/grub-core/fs/nilfs2.c b/grub-core/fs/nilfs2.c
  215. index fc7374ead..4e1e71738 100644
  216. --- a/grub-core/fs/nilfs2.c
  217. +++ b/grub-core/fs/nilfs2.c
  218. @@ -1231,6 +1231,7 @@ GRUB_MOD_INIT (nilfs2)
  219. grub_nilfs2_dat_entry));
  220. COMPILE_TIME_ASSERT (1 << LOG_INODE_SIZE
  221. == sizeof (struct grub_nilfs2_inode));
  222. + grub_nilfs2_fs.mod = mod;
  223. grub_fs_register (&grub_nilfs2_fs);
  224. my_mod = mod;
  225. }
  226. diff --git a/grub-core/fs/ntfs.c b/grub-core/fs/ntfs.c
  227. index de435aa14..560917dc2 100644
  228. --- a/grub-core/fs/ntfs.c
  229. +++ b/grub-core/fs/ntfs.c
  230. @@ -1320,6 +1320,7 @@ static struct grub_fs grub_ntfs_fs =
  231. GRUB_MOD_INIT (ntfs)
  232. {
  233. + grub_ntfs_fs.mod = mod;
  234. grub_fs_register (&grub_ntfs_fs);
  235. my_mod = mod;
  236. }
  237. diff --git a/grub-core/fs/odc.c b/grub-core/fs/odc.c
  238. index 790000622..8e4e8aeac 100644
  239. --- a/grub-core/fs/odc.c
  240. +++ b/grub-core/fs/odc.c
  241. @@ -52,6 +52,7 @@ read_number (const char *str, grub_size_t size)
  242. GRUB_MOD_INIT (odc)
  243. {
  244. + grub_cpio_fs.mod = mod;
  245. grub_fs_register (&grub_cpio_fs);
  246. }
  247. diff --git a/grub-core/fs/proc.c b/grub-core/fs/proc.c
  248. index 5f516502d..bcde43349 100644
  249. --- a/grub-core/fs/proc.c
  250. +++ b/grub-core/fs/proc.c
  251. @@ -192,6 +192,7 @@ static struct grub_fs grub_procfs_fs =
  252. GRUB_MOD_INIT (procfs)
  253. {
  254. + grub_procfs_fs.mod = mod;
  255. grub_disk_dev_register (&grub_procfs_dev);
  256. grub_fs_register (&grub_procfs_fs);
  257. }
  258. diff --git a/grub-core/fs/reiserfs.c b/grub-core/fs/reiserfs.c
  259. index 36b26ac98..c3850e013 100644
  260. --- a/grub-core/fs/reiserfs.c
  261. +++ b/grub-core/fs/reiserfs.c
  262. @@ -1417,6 +1417,7 @@ static struct grub_fs grub_reiserfs_fs =
  263. GRUB_MOD_INIT(reiserfs)
  264. {
  265. + grub_reiserfs_fs.mod = mod;
  266. grub_fs_register (&grub_reiserfs_fs);
  267. my_mod = mod;
  268. }
  269. diff --git a/grub-core/fs/romfs.c b/grub-core/fs/romfs.c
  270. index 1f7dcfca1..56b0b2b2f 100644
  271. --- a/grub-core/fs/romfs.c
  272. +++ b/grub-core/fs/romfs.c
  273. @@ -475,6 +475,7 @@ static struct grub_fs grub_romfs_fs =
  274. GRUB_MOD_INIT(romfs)
  275. {
  276. + grub_romfs_fs.mod = mod;
  277. grub_fs_register (&grub_romfs_fs);
  278. }
  279. diff --git a/grub-core/fs/sfs.c b/grub-core/fs/sfs.c
  280. index 983e88008..f0d7cac43 100644
  281. --- a/grub-core/fs/sfs.c
  282. +++ b/grub-core/fs/sfs.c
  283. @@ -779,6 +779,7 @@ static struct grub_fs grub_sfs_fs =
  284. GRUB_MOD_INIT(sfs)
  285. {
  286. + grub_sfs_fs.mod = mod;
  287. grub_fs_register (&grub_sfs_fs);
  288. my_mod = mod;
  289. }
  290. diff --git a/grub-core/fs/squash4.c b/grub-core/fs/squash4.c
  291. index a30e6ebe1..6e9d63874 100644
  292. --- a/grub-core/fs/squash4.c
  293. +++ b/grub-core/fs/squash4.c
  294. @@ -1044,6 +1044,7 @@ static struct grub_fs grub_squash_fs =
  295. GRUB_MOD_INIT(squash4)
  296. {
  297. + grub_squash_fs.mod = mod;
  298. grub_fs_register (&grub_squash_fs);
  299. }
  300. diff --git a/grub-core/fs/tar.c b/grub-core/fs/tar.c
  301. index 386c09022..fd2ec1f74 100644
  302. --- a/grub-core/fs/tar.c
  303. +++ b/grub-core/fs/tar.c
  304. @@ -354,6 +354,7 @@ static struct grub_fs grub_cpio_fs = {
  305. GRUB_MOD_INIT (tar)
  306. {
  307. + grub_cpio_fs.mod = mod;
  308. grub_fs_register (&grub_cpio_fs);
  309. }
  310. diff --git a/grub-core/fs/udf.c b/grub-core/fs/udf.c
  311. index b836e6107..8765c633c 100644
  312. --- a/grub-core/fs/udf.c
  313. +++ b/grub-core/fs/udf.c
  314. @@ -1455,6 +1455,7 @@ static struct grub_fs grub_udf_fs = {
  315. GRUB_MOD_INIT (udf)
  316. {
  317. + grub_udf_fs.mod = mod;
  318. grub_fs_register (&grub_udf_fs);
  319. my_mod = mod;
  320. }
  321. diff --git a/grub-core/fs/ufs.c b/grub-core/fs/ufs.c
  322. index 01235101b..e82d9356d 100644
  323. --- a/grub-core/fs/ufs.c
  324. +++ b/grub-core/fs/ufs.c
  325. @@ -899,6 +899,7 @@ GRUB_MOD_INIT(ufs1)
  326. #endif
  327. #endif
  328. {
  329. + grub_ufs_fs.mod = mod;
  330. grub_fs_register (&grub_ufs_fs);
  331. my_mod = mod;
  332. }
  333. diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c
  334. index 56738a135..74feeb86a 100644
  335. --- a/grub-core/fs/xfs.c
  336. +++ b/grub-core/fs/xfs.c
  337. @@ -1294,6 +1294,7 @@ static struct grub_fs grub_xfs_fs =
  338. GRUB_MOD_INIT(xfs)
  339. {
  340. + grub_xfs_fs.mod = mod;
  341. grub_fs_register (&grub_xfs_fs);
  342. my_mod = mod;
  343. }
  344. diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c
  345. index b5453e006..a497b1869 100644
  346. --- a/grub-core/fs/zfs/zfs.c
  347. +++ b/grub-core/fs/zfs/zfs.c
  348. @@ -4424,6 +4424,7 @@ static struct grub_fs grub_zfs_fs = {
  349. GRUB_MOD_INIT (zfs)
  350. {
  351. COMPILE_TIME_ASSERT (sizeof (zap_leaf_chunk_t) == ZAP_LEAF_CHUNKSIZE);
  352. + grub_zfs_fs.mod = mod;
  353. grub_fs_register (&grub_zfs_fs);
  354. #ifndef GRUB_UTIL
  355. my_mod = mod;
  356. diff --git a/grub-core/kern/file.c b/grub-core/kern/file.c
  357. index e990507fc..6e7efe89a 100644
  358. --- a/grub-core/kern/file.c
  359. +++ b/grub-core/kern/file.c
  360. @@ -25,6 +25,7 @@
  361. #include <grub/fs.h>
  362. #include <grub/device.h>
  363. #include <grub/i18n.h>
  364. +#include <grub/dl.h>
  365. void (*EXPORT_VAR (grub_grubnet_fini)) (void);
  366. @@ -117,6 +118,9 @@ grub_file_open (const char *name, enum grub_file_type type)
  367. if (file->data == NULL)
  368. goto fail;
  369. + if (file->fs->mod)
  370. + grub_dl_ref (file->fs->mod);
  371. +
  372. file->name = grub_strdup (name);
  373. grub_errno = GRUB_ERR_NONE;
  374. @@ -197,6 +201,9 @@ grub_file_read (grub_file_t file, void *buf, grub_size_t len)
  375. grub_err_t
  376. grub_file_close (grub_file_t file)
  377. {
  378. + if (file->fs->mod)
  379. + grub_dl_unref (file->fs->mod);
  380. +
  381. if (file->fs->fs_close)
  382. (file->fs->fs_close) (file);
  383. diff --git a/include/grub/fs.h b/include/grub/fs.h
  384. index 026bc3bb8..df4c93b16 100644
  385. --- a/include/grub/fs.h
  386. +++ b/include/grub/fs.h
  387. @@ -23,6 +23,7 @@
  388. #include <grub/device.h>
  389. #include <grub/symbol.h>
  390. #include <grub/types.h>
  391. +#include <grub/dl.h>
  392. #include <grub/list.h>
  393. /* For embedding types. */
  394. @@ -57,6 +58,9 @@ struct grub_fs
  395. /* My name. */
  396. const char *name;
  397. + /* My module */
  398. + grub_dl_t mod;
  399. +
  400. /* Call HOOK with each file under DIR. */
  401. grub_err_t (*fs_dir) (grub_device_t device, const char *path,
  402. grub_fs_dir_hook_t hook, void *hook_data);
  403. --
  404. 2.50.1