PageRenderTime 60ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/filesystems/unixfs/ufs/ufs.c

http://macfuse.googlecode.com/
C | 1698 lines | 1319 code | 335 blank | 44 comment | 197 complexity | 7723892cb9dd127fdab29bb22c63f2d1 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, GPL-2.0
  1. /*
  2. * UFS for MacFUSE
  3. * Amit Singh
  4. * http://osxbook.com
  5. *
  6. * Most of the code in this file comes from the Linux kernel implementation
  7. * of UFS. See fs/ufs/ in the Linux kernel source tree.
  8. *
  9. * The code is Copyright (c) its various authors. It is covered by the
  10. * GNU GENERAL PUBLIC LICENSE Version 2.
  11. */
  12. #include "ufs.h"
  13. #include <errno.h>
  14. #include <fcntl.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19. #include <sys/ioctl.h>
  20. #include <sys/stat.h>
  21. #include <ufs/util.c>
  22. static ino_t ufs_find_entry_s(struct inode *dir, const char* name);
  23. static int ufs_get_dirpage(struct inode *inode, sector_t index, char *pagebuf);
  24. static int ufs_read_cylinder_structures(struct super_block *sb);
  25. static void ufs_print_cylinder_stuff(struct super_block* sb,
  26. struct ufs_cylinder_group* cg);
  27. static void ufs_setup_cstotal(struct super_block* sb);
  28. static int ufs_read_cylinder_structures(struct super_block* sb);
  29. static u64 ufs_frag_map(struct inode *inode, sector_t frag, int* error);
  30. int ufs_getfrag_block(struct inode* inode, sector_t fragment,
  31. struct buffer_head* bh_result, int create);
  32. static struct buffer_head* ufs_getfrag(struct inode* inode,
  33. unsigned int fragment,
  34. int create, int* err);
  35. struct buffer_head* ufs_bread(struct inode* inode, unsigned fragment,
  36. int create, int* err);
  37. static int ufs1_read_inode(struct inode* inode, struct ufs_inode* ufs_inode);
  38. static int ufs2_read_inode(struct inode* inode, struct ufs2_inode* ufs2_inode);
  39. static unsigned ufs_last_byte(struct inode* inode, unsigned long page_nr);
  40. static int ufs_get_dirpage(struct inode* inode, sector_t index, char* pagebuf);
  41. static ino_t ufs_find_entry_s(struct inode* dir, const char* name);
  42. #define UFS_USED __attribute__((used))
  43. static struct ufs_dir_entry*
  44. ufs_dotdot_s(struct inode* dir, char* pagebuf) UFS_USED;
  45. static int
  46. ufs_check_page(struct inode* dir, sector_t index, char* page) UFS_USED;
  47. static void
  48. ufs_print_super_stuff(struct super_block* sb,
  49. struct ufs_super_block_first* usb1,
  50. struct ufs_super_block_second* usb2,
  51. struct ufs_super_block_third* usb3) UFS_USED;
  52. enum {
  53. Opt_type_old = UFS_MOUNT_UFSTYPE_OLD,
  54. Opt_type_sunx86 = UFS_MOUNT_UFSTYPE_SUNx86,
  55. Opt_type_sun = UFS_MOUNT_UFSTYPE_SUN,
  56. Opt_type_sunos = UFS_MOUNT_UFSTYPE_SUNOS,
  57. Opt_type_44bsd = UFS_MOUNT_UFSTYPE_44BSD,
  58. Opt_type_ufs2 = UFS_MOUNT_UFSTYPE_UFS2,
  59. Opt_type_hp = UFS_MOUNT_UFSTYPE_HP,
  60. Opt_type_nextstepcd = UFS_MOUNT_UFSTYPE_NEXTSTEP_CD,
  61. Opt_type_nextstep = UFS_MOUNT_UFSTYPE_NEXTSTEP,
  62. Opt_type_openstep = UFS_MOUNT_UFSTYPE_OPENSTEP,
  63. Opt_onerror_panic = UFS_MOUNT_ONERROR_PANIC,
  64. Opt_onerror_lock = UFS_MOUNT_ONERROR_LOCK,
  65. Opt_onerror_umount = UFS_MOUNT_ONERROR_UMOUNT,
  66. Opt_onerror_repair = UFS_MOUNT_ONERROR_REPAIR,
  67. Opt_err
  68. };
  69. static match_table_t tokens __attribute__((used)) = {
  70. { Opt_type_old, "old" },
  71. { Opt_type_sunx86, "sunx86" },
  72. { Opt_type_sun, "sun" },
  73. { Opt_type_sunos, "sunos" },
  74. { Opt_type_44bsd, "44bsd" },
  75. { Opt_type_ufs2, "ufs2" },
  76. { Opt_type_ufs2, "5xbsd" },
  77. { Opt_type_hp, "hp" },
  78. { Opt_type_nextstepcd, "nextstep-cd" },
  79. { Opt_type_nextstep, "nextstep" },
  80. { Opt_type_openstep, "openstep" },
  81. /* end of possible ufs types */
  82. { Opt_onerror_panic, "onerror=panic" },
  83. { Opt_onerror_lock, "onerror=lock" },
  84. { Opt_onerror_umount, "onerror=umount" },
  85. { Opt_onerror_repair, "onerror=repair" },
  86. { Opt_err, NULL}
  87. };
  88. static void
  89. ufs_print_super_stuff(struct super_block* sb,
  90. struct ufs_super_block_first* usb1,
  91. struct ufs_super_block_second* usb2,
  92. struct ufs_super_block_third* usb3)
  93. {
  94. u32 magic = fs32_to_cpu(sb, usb3->fs_magic);
  95. printk("ufs_print_super_stuff\n");
  96. printk(" magic: 0x%x\n", magic);
  97. if (fs32_to_cpu(sb, usb3->fs_magic) == UFS2_MAGIC) {
  98. printk(" fs_size: %llu\n", (unsigned long long)
  99. fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size));
  100. printk(" fs_dsize: %llu\n", (unsigned long long)
  101. fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize));
  102. printk(" bsize: %u\n",
  103. fs32_to_cpu(sb, usb1->fs_bsize));
  104. printk(" fsize: %u\n",
  105. fs32_to_cpu(sb, usb1->fs_fsize));
  106. printk(" fs_volname: %s\n", usb2->fs_un.fs_u2.fs_volname);
  107. printk(" fs_sblockloc: %llu\n", (unsigned long long)
  108. fs64_to_cpu(sb, usb2->fs_un.fs_u2.fs_sblockloc));
  109. printk(" cs_ndir(No of dirs): %llu\n", (unsigned long long)
  110. fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir));
  111. printk(" cs_nbfree(No of free blocks): %llu\n",
  112. (unsigned long long)
  113. fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_nbfree));
  114. printk(KERN_INFO" cs_nifree(Num of free inodes): %llu\n",
  115. (unsigned long long)
  116. fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nifree));
  117. printk(KERN_INFO" cs_nffree(Num of free frags): %llu\n",
  118. (unsigned long long)
  119. fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nffree));
  120. printk(KERN_INFO" fs_maxsymlinklen: %u\n",
  121. fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_maxsymlinklen));
  122. } else {
  123. printk(" sblkno: %u\n", fs32_to_cpu(sb, usb1->fs_sblkno));
  124. printk(" cblkno: %u\n", fs32_to_cpu(sb, usb1->fs_cblkno));
  125. printk(" iblkno: %u\n", fs32_to_cpu(sb, usb1->fs_iblkno));
  126. printk(" dblkno: %u\n", fs32_to_cpu(sb, usb1->fs_dblkno));
  127. printk(" cgoffset: %u\n",
  128. fs32_to_cpu(sb, usb1->fs_cgoffset));
  129. printk(" ~cgmask: 0x%x\n",
  130. ~fs32_to_cpu(sb, usb1->fs_cgmask));
  131. printk(" size: %u\n", fs32_to_cpu(sb, usb1->fs_size));
  132. printk(" dsize: %u\n", fs32_to_cpu(sb, usb1->fs_dsize));
  133. printk(" ncg: %u\n", fs32_to_cpu(sb, usb1->fs_ncg));
  134. printk(" bsize: %u\n", fs32_to_cpu(sb, usb1->fs_bsize));
  135. printk(" fsize: %u\n", fs32_to_cpu(sb, usb1->fs_fsize));
  136. printk(" frag: %u\n", fs32_to_cpu(sb, usb1->fs_frag));
  137. printk(" fragshift: %u\n",
  138. fs32_to_cpu(sb, usb1->fs_fragshift));
  139. printk(" ~fmask: %u\n", ~fs32_to_cpu(sb, usb1->fs_fmask));
  140. printk(" fshift: %u\n", fs32_to_cpu(sb, usb1->fs_fshift));
  141. printk(" sbsize: %u\n", fs32_to_cpu(sb, usb1->fs_sbsize));
  142. printk(" spc: %u\n", fs32_to_cpu(sb, usb1->fs_spc));
  143. printk(" cpg: %u\n", fs32_to_cpu(sb, usb1->fs_cpg));
  144. printk(" ipg: %u\n", fs32_to_cpu(sb, usb1->fs_ipg));
  145. printk(" fpg: %u\n", fs32_to_cpu(sb, usb1->fs_fpg));
  146. printk(" csaddr: %u\n", fs32_to_cpu(sb, usb1->fs_csaddr));
  147. printk(" cssize: %u\n", fs32_to_cpu(sb, usb1->fs_cssize));
  148. printk(" cgsize: %u\n", fs32_to_cpu(sb, usb1->fs_cgsize));
  149. printk(" fstodb: %u\n",
  150. fs32_to_cpu(sb, usb1->fs_fsbtodb));
  151. printk(" nrpos: %u\n", fs32_to_cpu(sb, usb3->fs_nrpos));
  152. printk(" ndir %u\n",
  153. fs32_to_cpu(sb, usb1->fs_cstotal.cs_ndir));
  154. printk(" nifree %u\n",
  155. fs32_to_cpu(sb, usb1->fs_cstotal.cs_nifree));
  156. printk(" nbfree %u\n",
  157. fs32_to_cpu(sb, usb1->fs_cstotal.cs_nbfree));
  158. printk(" nffree %u\n",
  159. fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree));
  160. }
  161. printk("\n");
  162. }
  163. static void
  164. ufs_print_cylinder_stuff(struct super_block* sb, struct ufs_cylinder_group* cg)
  165. {
  166. printk("\nufs_print_cylinder_stuff\n");
  167. printk("size of ucg: %zu\n", sizeof(struct ufs_cylinder_group));
  168. printk(" magic: %x\n", fs32_to_cpu(sb, cg->cg_magic));
  169. printk(" time: %u\n", fs32_to_cpu(sb, cg->cg_time));
  170. printk(" cgx: %u\n", fs32_to_cpu(sb, cg->cg_cgx));
  171. printk(" ncyl: %u\n", fs16_to_cpu(sb, cg->cg_ncyl));
  172. printk(" niblk: %u\n", fs16_to_cpu(sb, cg->cg_niblk));
  173. printk(" ndblk: %u\n", fs32_to_cpu(sb, cg->cg_ndblk));
  174. printk(" cs_ndir: %u\n", fs32_to_cpu(sb, cg->cg_cs.cs_ndir));
  175. printk(" cs_nbfree: %u\n", fs32_to_cpu(sb, cg->cg_cs.cs_nbfree));
  176. printk(" cs_nifree: %u\n", fs32_to_cpu(sb, cg->cg_cs.cs_nifree));
  177. printk(" cs_nffree: %u\n", fs32_to_cpu(sb, cg->cg_cs.cs_nffree));
  178. printk(" rotor: %u\n", fs32_to_cpu(sb, cg->cg_rotor));
  179. printk(" frotor: %u\n", fs32_to_cpu(sb, cg->cg_frotor));
  180. printk(" irotor: %u\n", fs32_to_cpu(sb, cg->cg_irotor));
  181. printk(" frsum: %u, %u, %u, %u, %u, %u, %u, %u\n",
  182. fs32_to_cpu(sb, cg->cg_frsum[0]), fs32_to_cpu(sb, cg->cg_frsum[1]),
  183. fs32_to_cpu(sb, cg->cg_frsum[2]), fs32_to_cpu(sb, cg->cg_frsum[3]),
  184. fs32_to_cpu(sb, cg->cg_frsum[4]), fs32_to_cpu(sb, cg->cg_frsum[5]),
  185. fs32_to_cpu(sb, cg->cg_frsum[6]), fs32_to_cpu(sb, cg->cg_frsum[7]));
  186. printk(" btotoff: %u\n", fs32_to_cpu(sb, cg->cg_btotoff));
  187. printk(" boff: %u\n", fs32_to_cpu(sb, cg->cg_boff));
  188. printk(" iuseoff: %u\n", fs32_to_cpu(sb, cg->cg_iusedoff));
  189. printk(" freeoff: %u\n", fs32_to_cpu(sb, cg->cg_freeoff));
  190. printk(" nextfreeoff: %u\n", fs32_to_cpu(sb, cg->cg_nextfreeoff));
  191. printk(" clustersumoff %u\n",
  192. fs32_to_cpu(sb, cg->cg_u.cg_44.cg_clustersumoff));
  193. printk(" clusteroff %u\n",
  194. fs32_to_cpu(sb, cg->cg_u.cg_44.cg_clusteroff));
  195. printk(" nclusterblks %u\n",
  196. fs32_to_cpu(sb, cg->cg_u.cg_44.cg_nclusterblks));
  197. printk("\n");
  198. }
  199. static int
  200. ufs_parse_options(char* options, unsigned* mount_options)
  201. {
  202. char* p;
  203. UFSD("ENTER\n");
  204. if (!options)
  205. return 1;
  206. while ((p = strsep(&options, ",")) != NULL) {
  207. substring_t args[MAX_OPT_ARGS];
  208. int token;
  209. if (!*p)
  210. continue;
  211. token = match_token(p, tokens, args);
  212. switch (token) {
  213. case Opt_type_old:
  214. ufs_clear_opt(*mount_options, UFSTYPE);
  215. ufs_set_opt(*mount_options, UFSTYPE_OLD);
  216. break;
  217. case Opt_type_sunx86:
  218. ufs_clear_opt(*mount_options, UFSTYPE);
  219. ufs_set_opt(*mount_options, UFSTYPE_SUNx86);
  220. break;
  221. case Opt_type_sun:
  222. ufs_clear_opt(*mount_options, UFSTYPE);
  223. ufs_set_opt(*mount_options, UFSTYPE_SUN);
  224. break;
  225. case Opt_type_sunos:
  226. ufs_clear_opt(*mount_options, UFSTYPE);
  227. ufs_set_opt(*mount_options, UFSTYPE_SUNOS);
  228. break;
  229. case Opt_type_44bsd:
  230. ufs_clear_opt(*mount_options, UFSTYPE);
  231. ufs_set_opt(*mount_options, UFSTYPE_44BSD);
  232. break;
  233. case Opt_type_ufs2:
  234. ufs_clear_opt(*mount_options, UFSTYPE);
  235. ufs_set_opt(*mount_options, UFSTYPE_UFS2);
  236. break;
  237. case Opt_type_hp:
  238. ufs_clear_opt(*mount_options, UFSTYPE);
  239. ufs_set_opt(*mount_options, UFSTYPE_HP);
  240. break;
  241. case Opt_type_nextstepcd:
  242. ufs_clear_opt(*mount_options, UFSTYPE);
  243. ufs_set_opt(*mount_options, UFSTYPE_NEXTSTEP_CD);
  244. break;
  245. case Opt_type_nextstep:
  246. ufs_clear_opt(*mount_options, UFSTYPE);
  247. ufs_set_opt(*mount_options, UFSTYPE_NEXTSTEP);
  248. break;
  249. case Opt_type_openstep:
  250. ufs_clear_opt(*mount_options, UFSTYPE);
  251. ufs_set_opt(*mount_options, UFSTYPE_OPENSTEP);
  252. break;
  253. case Opt_onerror_panic:
  254. ufs_clear_opt(*mount_options, ONERROR);
  255. ufs_set_opt(*mount_options, ONERROR_PANIC);
  256. break;
  257. case Opt_onerror_lock:
  258. ufs_clear_opt(*mount_options, ONERROR);
  259. ufs_set_opt(*mount_options, ONERROR_LOCK);
  260. break;
  261. case Opt_onerror_umount:
  262. ufs_clear_opt(*mount_options, ONERROR);
  263. ufs_set_opt(*mount_options, ONERROR_UMOUNT);
  264. break;
  265. case Opt_onerror_repair:
  266. printk("UFS-fs: Unable to do repair on error, "
  267. "will lock lock instead\n");
  268. ufs_clear_opt(*mount_options, ONERROR);
  269. ufs_set_opt(*mount_options, ONERROR_REPAIR);
  270. break;
  271. default:
  272. printk("UFS-fs: Invalid option: \"%s\" or missing value\n", p);
  273. return 0;
  274. }
  275. }
  276. return 1;
  277. }
  278. static void
  279. ufs_setup_cstotal(struct super_block* sb)
  280. {
  281. struct ufs_sb_info* sbi = UFS_SB(sb);
  282. struct ufs_sb_private_info* uspi = sbi->s_uspi;
  283. struct ufs_super_block_first* usb1;
  284. struct ufs_super_block_second* usb2;
  285. struct ufs_super_block_third* usb3;
  286. unsigned mtype = sbi->s_mount_opt & UFS_MOUNT_UFSTYPE;
  287. UFSD("ENTER, mtype=%u\n", mtype);
  288. usb1 = ubh_get_usb_first(uspi);
  289. usb2 = ubh_get_usb_second(uspi);
  290. usb3 = ubh_get_usb_third(uspi);
  291. if ((mtype == UFS_MOUNT_UFSTYPE_44BSD &&
  292. (usb1->fs_flags & UFS_FLAGS_UPDATED)) ||
  293. (mtype == UFS_MOUNT_UFSTYPE_UFS2)) {
  294. uspi->cs_total.cs_ndir = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir);
  295. uspi->cs_total.cs_nbfree = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_nbfree);
  296. uspi->cs_total.cs_nifree =
  297. fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nifree);
  298. uspi->cs_total.cs_nffree =
  299. fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nffree);
  300. } else {
  301. uspi->cs_total.cs_ndir = fs32_to_cpu(sb, usb1->fs_cstotal.cs_ndir);
  302. uspi->cs_total.cs_nbfree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nbfree);
  303. uspi->cs_total.cs_nifree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nifree);
  304. uspi->cs_total.cs_nffree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree);
  305. }
  306. UFSD("EXIT\n");
  307. }
  308. static int
  309. ufs_read_cylinder_structures(struct super_block* sb)
  310. {
  311. struct ufs_sb_info* sbi = UFS_SB(sb);
  312. struct ufs_sb_private_info* uspi = sbi->s_uspi;
  313. struct ufs_buffer_head* ubh;
  314. unsigned char* base;
  315. unsigned char* space;
  316. unsigned size, blks, i;
  317. struct ufs_super_block_third* usb3;
  318. UFSD("ENTER\n");
  319. usb3 = ubh_get_usb_third(uspi);
  320. /* Read cs structures from (usually) first data block on the device. */
  321. size = uspi->s_cssize;
  322. blks = (size + uspi->s_fsize - 1) >> uspi->s_fshift;
  323. base = space = kmalloc(size, GFP_KERNEL);
  324. if (!base)
  325. goto failed;
  326. sbi->s_csp = (struct ufs_csum*)space;
  327. for (i = 0; i < blks; i += uspi->s_fpb) {
  328. size = uspi->s_bsize;
  329. if (i + uspi->s_fpb > blks)
  330. size = (blks - i) * uspi->s_fsize;
  331. ubh = ubh_bread(sb, uspi->s_csaddr + i, size);
  332. if (!ubh)
  333. goto failed;
  334. ubh_ubhcpymem (space, ubh, size);
  335. space += size;
  336. ubh_brelse (ubh);
  337. ubh = NULL;
  338. }
  339. /*
  340. * Read cylinder group (we read only first fragment from block
  341. * at this time) and prepare internal data structures for cg caching.
  342. */
  343. if (!(sbi->s_ucg = kmalloc(sizeof(struct buffer_head*) * uspi->s_ncg,
  344. GFP_KERNEL)))
  345. goto failed;
  346. for (i = 0; i < uspi->s_ncg; i++)
  347. sbi->s_ucg[i] = NULL;
  348. for (i = 0; i < UFS_MAX_GROUP_LOADED; i++) {
  349. sbi->s_ucpi[i] = NULL;
  350. sbi->s_cgno[i] = UFS_CGNO_EMPTY;
  351. }
  352. for (i = 0; i < uspi->s_ncg; i++) {
  353. UFSD("read cg %u\n", i);
  354. if (!(sbi->s_ucg[i] = sb_bread(sb, ufs_cgcmin(i))))
  355. goto failed;
  356. if (!ufs_cg_chkmagic(sb,
  357. (struct ufs_cylinder_group*)sbi->s_ucg[i]->b_data))
  358. goto failed;
  359. ufs_print_cylinder_stuff(sb,
  360. (struct ufs_cylinder_group*)sbi->s_ucg[i]->b_data);
  361. }
  362. for (i = 0; i < UFS_MAX_GROUP_LOADED; i++) {
  363. if (!(sbi->s_ucpi[i] = kmalloc(sizeof(struct ufs_cg_private_info),
  364. GFP_KERNEL)))
  365. goto failed;
  366. sbi->s_cgno[i] = UFS_CGNO_EMPTY;
  367. }
  368. sbi->s_cg_loaded = 0;
  369. UFSD("EXIT\n");
  370. return 1;
  371. failed:
  372. kfree(base);
  373. if (sbi->s_ucg) {
  374. for (i = 0; i < uspi->s_ncg; i++)
  375. if (sbi->s_ucg[i])
  376. brelse (sbi->s_ucg[i]);
  377. kfree (sbi->s_ucg);
  378. for (i = 0; i < UFS_MAX_GROUP_LOADED; i++)
  379. kfree (sbi->s_ucpi[i]);
  380. }
  381. UFSD("EXIT (FAILED)\n");
  382. return 0;
  383. }
  384. static int
  385. ufs_block_to_path(struct inode* inode, sector_t i_block, sector_t offsets[4])
  386. {
  387. struct ufs_sb_private_info* uspi = UFS_SB(inode->I_sb)->s_uspi;
  388. int ptrs = uspi->s_apb;
  389. int ptrs_bits = uspi->s_apbshift;
  390. const long direct_blocks = UFS_NDADDR,
  391. indirect_blocks = ptrs,
  392. double_blocks = (1 << (ptrs_bits * 2));
  393. int n = 0;
  394. UFSD("ptrs=uspi->s_apb = %d,double_blocks=%ld \n",ptrs,double_blocks);
  395. if (i_block < 0) {
  396. fprintf(stderr, "ufs_block_to_path: block < 0\n");
  397. } else if (i_block < direct_blocks) {
  398. offsets[n++] = i_block;
  399. } else if ((i_block -= direct_blocks) < indirect_blocks) {
  400. offsets[n++] = UFS_IND_BLOCK;
  401. offsets[n++] = i_block;
  402. } else if ((i_block -= indirect_blocks) < double_blocks) {
  403. offsets[n++] = UFS_DIND_BLOCK;
  404. offsets[n++] = i_block >> ptrs_bits;
  405. offsets[n++] = i_block & (ptrs - 1);
  406. } else if (((i_block -= double_blocks) >> (ptrs_bits * 2)) < ptrs) {
  407. offsets[n++] = UFS_TIND_BLOCK;
  408. offsets[n++] = i_block >> (ptrs_bits * 2);
  409. offsets[n++] = (i_block >> ptrs_bits) & (ptrs - 1);
  410. offsets[n++] = i_block & (ptrs - 1);
  411. } else {
  412. fprintf(stderr, "ufs_block_to_path: block > big\n");
  413. }
  414. return n;
  415. }
  416. /* Returns the location of the fragment from the begining of the filesystem. */
  417. static u64
  418. ufs_frag_map(struct inode* inode, sector_t frag, int* error)
  419. {
  420. struct ufs_inode_info* ufsi = inode->I_private;
  421. struct super_block* sb = inode->I_sb;
  422. struct ufs_sb_private_info* uspi = UFS_SB(sb)->s_uspi;
  423. u64 mask = (u64)uspi->s_apbmask>>uspi->s_fpbshift;
  424. int shift = uspi->s_apbshift-uspi->s_fpbshift;
  425. unsigned flags = UFS_SB(sb)->s_flags;
  426. sector_t offsets[4];
  427. sector_t* p;
  428. int depth = ufs_block_to_path(inode, frag >> uspi->s_fpbshift, offsets);
  429. u64 ret = 0L;
  430. u64 temp = 0L;
  431. __fs32 block;
  432. __fs64 u2_block = 0L;
  433. UFSD(": frag = %llu depth = %d\n", (unsigned long long)frag, depth);
  434. UFSD(": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n",
  435. uspi->s_fpbshift, uspi->s_apbmask, (unsigned long long)mask);
  436. if (depth == 0)
  437. return 0;
  438. p = offsets;
  439. lock_kernel();
  440. if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2)
  441. goto ufs2;
  442. block = ufsi->i_u1.i_data[*p++];
  443. if (!block)
  444. goto out;
  445. while (--depth) {
  446. struct buffer_head _bh;
  447. struct buffer_head* bh = &_bh;
  448. sector_t n = *p++;
  449. bh->b_flags.dynamic = 0;
  450. if (sb_bread_intobh(sb, uspi->s_sbbase +
  451. fs32_to_cpu(sb, block) + (n >> shift), bh) != 0)
  452. goto out;
  453. block = ((__fs32 *) bh->b_data)[n & mask];
  454. brelse (bh);
  455. if (!block)
  456. goto out;
  457. }
  458. ret = (u64)(uspi->s_sbbase + fs32_to_cpu(sb, block) +
  459. (frag & uspi->s_fpbmask));
  460. goto out;
  461. ufs2:
  462. u2_block = ufsi->i_u1.u2_i_data[*p++];
  463. if (!u2_block)
  464. goto out;
  465. while (--depth) {
  466. struct buffer_head _bh;
  467. struct buffer_head* bh = &_bh;
  468. sector_t n = *p++;
  469. temp = (u64)(uspi->s_sbbase) + fs64_to_cpu(sb, u2_block);
  470. bh->b_flags.dynamic = 0;
  471. if (sb_bread_intobh(sb, temp +(u64) (n>>shift), bh) != 0)
  472. goto out;
  473. u2_block = ((__fs64 *)bh->b_data)[n & mask];
  474. brelse(bh);
  475. if (!u2_block)
  476. goto out;
  477. }
  478. temp = (u64)uspi->s_sbbase + fs64_to_cpu(sb, u2_block);
  479. ret = temp + (u64)(frag & uspi->s_fpbmask);
  480. out:
  481. unlock_kernel();
  482. return ret;
  483. }
  484. int
  485. ufs_getfrag_block(struct inode* inode, sector_t fragment,
  486. struct buffer_head* bh_result, int create)
  487. {
  488. int err;
  489. u64 phys64 = 0;
  490. struct super_block* sb = inode->I_sb;
  491. if (!create) {
  492. phys64 = ufs_frag_map(inode, fragment, &err);
  493. UFSD("phys64 = %llu\n", (unsigned long long)phys64);
  494. if (phys64) {
  495. bh_result->b_blocknr = phys64; /* map_bh */
  496. bh_result->b_size = sb->s_blocksize; /* map_bh */
  497. }
  498. return 0;
  499. }
  500. return -1;
  501. }
  502. static struct buffer_head*
  503. ufs_getfrag(struct inode* inode, unsigned int fragment, int create, int* err)
  504. {
  505. struct buffer_head dummy;
  506. int error;
  507. dummy.b_blocknr = -1000;
  508. error = ufs_getfrag_block(inode, fragment, &dummy, create);
  509. *err = error;
  510. if (!error) {
  511. struct buffer_head *bh;
  512. bh = sb_getblk(inode->I_sb, dummy.b_blocknr);
  513. return bh;
  514. }
  515. return NULL;
  516. }
  517. /* We don't use this. */
  518. struct buffer_head*
  519. ufs_bread(struct inode* inode, unsigned fragment, int create, int* err)
  520. {
  521. struct buffer_head* bh;
  522. UFSD("ENTER, ino %llu, fragment %u\n", inode->I_ino, fragment);
  523. bh = ufs_getfrag(inode, fragment, create, err);
  524. if (!bh)
  525. return bh;
  526. struct buffer_head* bhnew = sb_bread(inode->I_sb, bh->b_blocknr);
  527. brelse(bh);
  528. return bhnew;
  529. }
  530. static int
  531. ufs1_read_inode(struct inode* inode, struct ufs_inode* ufs_inode)
  532. {
  533. struct ufs_inode_info* ufsi = inode->I_private;
  534. struct super_block* sb = inode->I_sb;
  535. mode_t mode;
  536. unsigned i;
  537. inode->I_mode = mode = fs16_to_cpu(sb, ufs_inode->ui_mode);
  538. inode->I_nlink = fs16_to_cpu(sb, ufs_inode->ui_nlink);
  539. if (inode->I_nlink == 0) {
  540. fprintf(stderr,
  541. "ufs_read_inode: inode %llu has zero nlink\n", inode->I_ino);
  542. return -1;
  543. }
  544. inode->I_uid = ufs_get_inode_uid(sb, ufs_inode);
  545. inode->I_gid = ufs_get_inode_gid(sb, ufs_inode);
  546. inode->I_size = fs64_to_cpu(sb, ufs_inode->ui_size);
  547. inode->I_atime.tv_sec = fs32_to_cpu(sb, ufs_inode->ui_atime.tv_sec);
  548. inode->I_ctime.tv_sec = fs32_to_cpu(sb, ufs_inode->ui_ctime.tv_sec);
  549. inode->I_mtime.tv_sec = fs32_to_cpu(sb, ufs_inode->ui_mtime.tv_sec);
  550. inode->I_mtime.tv_nsec = 0;
  551. inode->I_atime.tv_nsec = 0;
  552. inode->I_ctime.tv_nsec = 0;
  553. inode->I_blocks = fs32_to_cpu(sb, ufs_inode->ui_blocks);
  554. inode->I_generation = fs32_to_cpu(sb, ufs_inode->ui_gen);
  555. inode->I_flags = fs32_to_cpu(sb, ufs_inode->ui_flags); /* XXX */
  556. ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow);
  557. ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
  558. if (S_ISCHR(mode) || S_ISBLK(mode) || inode->I_blocks) {
  559. for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++)
  560. ufsi->i_u1.i_data[i] = ufs_inode->ui_u2.ui_addr.ui_db[i];
  561. } else {
  562. for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++)
  563. ufsi->i_u1.i_symlink[i] = ufs_inode->ui_u2.ui_symlink[i];
  564. }
  565. return 0;
  566. }
  567. static int
  568. ufs2_read_inode(struct inode* inode, struct ufs2_inode* ufs2_inode)
  569. {
  570. struct ufs_inode_info* ufsi = inode->I_private;
  571. struct super_block* sb = inode->I_sb;
  572. mode_t mode;
  573. unsigned i;
  574. UFSD("Reading ufs2 inode, ino %llu\n", inode->I_ino);
  575. inode->I_mode = mode = fs16_to_cpu(sb, ufs2_inode->ui_mode);
  576. inode->I_nlink = fs16_to_cpu(sb, ufs2_inode->ui_nlink);
  577. if (inode->I_nlink == 0) {
  578. fprintf(stderr,
  579. "ufs_read_inode: inode %llu has zero nlink\n", inode->I_ino);
  580. return -1;
  581. }
  582. inode->I_uid = fs32_to_cpu(sb, ufs2_inode->ui_uid);
  583. inode->I_gid = fs32_to_cpu(sb, ufs2_inode->ui_gid);
  584. inode->I_size = fs64_to_cpu(sb, ufs2_inode->ui_size);
  585. inode->I_atime.tv_sec = fs64_to_cpu(sb, ufs2_inode->ui_atime);
  586. inode->I_ctime.tv_sec = fs64_to_cpu(sb, ufs2_inode->ui_ctime);
  587. inode->I_mtime.tv_sec = fs64_to_cpu(sb, ufs2_inode->ui_mtime);
  588. inode->I_atime.tv_nsec = fs32_to_cpu(sb, ufs2_inode->ui_atimensec);
  589. inode->I_ctime.tv_nsec = fs32_to_cpu(sb, ufs2_inode->ui_ctimensec);
  590. inode->I_mtime.tv_nsec = fs32_to_cpu(sb, ufs2_inode->ui_mtimensec);
  591. inode->I_blocks = fs64_to_cpu(sb, ufs2_inode->ui_blocks);
  592. inode->I_generation = fs32_to_cpu(sb, ufs2_inode->ui_gen);
  593. ufsi->i_flags = fs32_to_cpu(sb, ufs2_inode->ui_flags);
  594. /*
  595. * ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow);
  596. * ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
  597. */
  598. if (S_ISCHR(mode) || S_ISBLK(mode) || inode->I_blocks) {
  599. for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++)
  600. ufsi->i_u1.u2_i_data[i] =
  601. ufs2_inode->ui_u2.ui_addr.ui_db[i];
  602. } else {
  603. for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++)
  604. ufsi->i_u1.i_symlink[i] = ufs2_inode->ui_u2.ui_symlink[i];
  605. }
  606. return 0;
  607. }
  608. static inline int
  609. ufs_match(struct super_block* sb, int len, const char* const name,
  610. struct ufs_dir_entry* de)
  611. {
  612. if (len != ufs_get_de_namlen(sb, de))
  613. return 0;
  614. if (!de->d_ino)
  615. return 0;
  616. return !memcmp(name, de->d_name, len);
  617. }
  618. static inline struct ufs_dir_entry*
  619. ufs_next_entry(struct super_block* sb, struct ufs_dir_entry* p)
  620. {
  621. return (struct ufs_dir_entry*)((char*)p + fs16_to_cpu(sb, p->d_reclen));
  622. }
  623. static inline unsigned
  624. ufs_validate_entry(struct super_block* sb, char* base, unsigned offset,
  625. unsigned mask)
  626. {
  627. struct ufs_dir_entry* de = (struct ufs_dir_entry*)(base + offset);
  628. struct ufs_dir_entry* p = (struct ufs_dir_entry*)(base + (offset & mask));
  629. while ((char*)p < (char*)de) {
  630. if (p->d_reclen == 0)
  631. break;
  632. p = ufs_next_entry(sb, p);
  633. }
  634. return (char*)p - base;
  635. }
  636. static inline unsigned long
  637. ufs_dir_pages(struct inode *inode)
  638. {
  639. return (inode->I_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
  640. }
  641. static int
  642. ufs_check_page(struct inode* dir, sector_t index, char* page)
  643. {
  644. struct super_block* sb = dir->I_sb;
  645. char* kaddr = (char*)page;
  646. unsigned offs, rec_len;
  647. unsigned limit = PAGE_CACHE_SIZE;
  648. const unsigned chunk_mask = UFS_SB(sb)->s_uspi->s_dirblksize - 1;
  649. struct ufs_dir_entry*p;
  650. char* error;
  651. int fres = -1;
  652. if ((dir->I_size >> PAGE_CACHE_SHIFT) == index) {
  653. limit = dir->I_size & ~PAGE_CACHE_MASK;
  654. if (limit & chunk_mask)
  655. goto Ebadsize;
  656. if (!limit)
  657. goto out;
  658. }
  659. for (offs = 0; offs <= limit - UFS_DIR_REC_LEN(1); offs += rec_len) {
  660. p = (struct ufs_dir_entry*)(kaddr + offs);
  661. rec_len = fs16_to_cpu(sb, p->d_reclen);
  662. if (rec_len < UFS_DIR_REC_LEN(1))
  663. goto Eshort;
  664. if (rec_len & 3)
  665. goto Ealign;
  666. if (rec_len < UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, p)))
  667. goto Enamelen;
  668. if (((offs + rec_len - 1) ^ offs) & ~chunk_mask)
  669. goto Espan;
  670. if (fs32_to_cpu(sb, p->d_ino) > (UFS_SB(sb)->s_uspi->s_ipg *
  671. UFS_SB(sb)->s_uspi->s_ncg))
  672. goto Einumber;
  673. }
  674. if (offs != limit)
  675. goto Eend;
  676. out:
  677. return 0; /* good */
  678. Ebadsize:
  679. fprintf(stderr, "ufs_check_page: size of directory #%llu is "
  680. "not a multiple of chunk size", dir->I_ino);
  681. goto fail;
  682. Eshort:
  683. error = "rec_len is smaller than minimal";
  684. goto bad_entry;
  685. Ealign:
  686. error = "unaligned directory entry";
  687. goto bad_entry;
  688. Enamelen:
  689. error = "rec_len is too small for name_len";
  690. goto bad_entry;
  691. Espan:
  692. error = "directory entry across blocks";
  693. goto bad_entry;
  694. Einumber:
  695. error = "inode out of bounds";
  696. bad_entry:
  697. fprintf(stderr, "ufs_check_page: bad entry in directory #%llu: %s - "
  698. "offset=%llu, rec_len=%d, name_len=%d",
  699. dir->I_ino, error, (index << PAGE_CACHE_SHIFT) + offs,
  700. rec_len, ufs_get_de_namlen(sb, p));
  701. goto fail;
  702. Eend:
  703. p = (struct ufs_dir_entry *)(kaddr + offs);
  704. fprintf(stderr, "entry in directory #%llu spans the page boundary"
  705. "offset=%llu", dir->I_ino, (index << PAGE_CACHE_SHIFT) + offs);
  706. fail:
  707. return fres;
  708. }
  709. static unsigned
  710. ufs_last_byte(struct inode* inode, unsigned long page_nr)
  711. {
  712. unsigned last_byte = inode->I_size;
  713. last_byte -= page_nr << PAGE_CACHE_SHIFT;
  714. if (last_byte > PAGE_CACHE_SIZE)
  715. last_byte = PAGE_CACHE_SIZE;
  716. return last_byte;
  717. }
  718. static struct ufs_dir_entry*
  719. ufs_dotdot_s(struct inode* dir, char* pagebuf)
  720. {
  721. int ret = ufs_get_dirpage(dir, 0, pagebuf);
  722. struct ufs_dir_entry* de = NULL;
  723. if (ret == 0)
  724. de = ufs_next_entry(dir->I_sb, (struct ufs_dir_entry*)pagebuf);
  725. return de;
  726. }
  727. static int
  728. ufs_get_dirpage(struct inode* inode, sector_t index, char* pagebuf)
  729. {
  730. int ret = U_ufs_get_page(inode, index, pagebuf);
  731. /* if (ufs_check_page(inode, index, pagebuf) != 0) return -1; */
  732. return ret;
  733. }
  734. static ino_t
  735. ufs_find_entry_s(struct inode* dir, const char* name)
  736. {
  737. struct super_block* sb = dir->I_sb;
  738. struct ufs_inode_info* ui = dir->I_private;
  739. int namelen = strlen(name);
  740. unsigned reclen = UFS_DIR_REC_LEN(namelen);
  741. unsigned long npages = ufs_dir_pages(dir);
  742. unsigned long start, n;
  743. struct ufs_dir_entry* de;
  744. ino_t result = 0;
  745. UFSD("ENTER, dir_ino %llu, name %s, namlen %u\n",
  746. dir->I_ino, name, namelen);
  747. if (npages == 0 || namelen > UFS_MAXNAMLEN)
  748. goto out;
  749. start = ui->i_dir_start_lookup;
  750. if (start >= npages)
  751. start = 0;
  752. n = start;
  753. do {
  754. char page[PAGE_SIZE];
  755. char* kaddr;
  756. if (ufs_get_dirpage(dir, n, page) == 0) {
  757. kaddr = page;
  758. de = (struct ufs_dir_entry*)kaddr;
  759. kaddr += ufs_last_byte(dir, n) - reclen;
  760. while ((char*)de <= kaddr) {
  761. if (de->d_reclen == 0) {
  762. fprintf(stderr, "zero-length directory entry\n");
  763. goto out;
  764. }
  765. if (ufs_match(sb, namelen, (char*)name, de)) {
  766. result = fs32_to_cpu(sb, de->d_ino);
  767. goto found;
  768. }
  769. de = ufs_next_entry(sb, de);
  770. }
  771. }
  772. if (++n >= npages)
  773. n = 0;
  774. } while (n != start);
  775. out:
  776. return result;
  777. found:
  778. ui->i_dir_start_lookup = n;
  779. return result;
  780. }
  781. struct super_block*
  782. U_ufs_fill_super(int fd, void* data, int silent)
  783. {
  784. struct super_block* sb = NULL;
  785. struct ufs_sb_info* sbi = NULL;
  786. struct ufs_sb_private_info* uspi;
  787. struct ufs_super_block_first* usb1;
  788. struct ufs_super_block_second* usb2;
  789. struct ufs_super_block_third* usb3;
  790. struct ufs_buffer_head* ubh;
  791. unsigned block_size, super_block_size;
  792. unsigned flags, super_block_offset;
  793. uspi = NULL;
  794. ubh = NULL;
  795. flags = 0;
  796. UFSD("ENTER\n");
  797. sb = calloc(1, sizeof(struct super_block));
  798. if (!sb)
  799. return NULL;
  800. sb->s_bdev = fd;
  801. sb->s_flags |= MS_RDONLY;
  802. sbi = kzalloc(sizeof(struct ufs_sb_info), GFP_KERNEL);
  803. if (!sbi)
  804. goto failed_nomem;
  805. sbi->s_mount_opt = 0;
  806. sb->s_fs_info = sbi;
  807. ufs_set_opt(sbi->s_mount_opt, ONERROR_LOCK);
  808. if (!ufs_parse_options((char*) data, &sbi->s_mount_opt)) {
  809. printk("wrong mount options\n");
  810. goto failed;
  811. }
  812. if (!(sbi->s_mount_opt & UFS_MOUNT_UFSTYPE))
  813. ufs_set_opt(sbi->s_mount_opt, UFSTYPE_OLD);
  814. uspi = kzalloc(sizeof(struct ufs_sb_private_info), GFP_KERNEL);
  815. sbi->s_uspi = uspi;
  816. if (!uspi)
  817. goto failed;
  818. uspi->s_dirblksize = UFS_SECTOR_SIZE;
  819. super_block_offset=UFS_SBLOCK;
  820. switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) {
  821. case UFS_MOUNT_UFSTYPE_44BSD:
  822. UFSD("ufstype=44bsd\n");
  823. uspi->s_fsize = block_size = 512;
  824. uspi->s_fmask = ~(512 - 1);
  825. uspi->s_fshift = 9;
  826. uspi->s_sbsize = super_block_size = 1536;
  827. uspi->s_sbbase = 0;
  828. flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
  829. break;
  830. case UFS_MOUNT_UFSTYPE_UFS2:
  831. UFSD("ufstype=ufs2\n");
  832. super_block_offset = SBLOCK_UFS2;
  833. uspi->s_fsize = block_size = 512;
  834. uspi->s_fmask = ~(512 - 1);
  835. uspi->s_fshift = 9;
  836. uspi->s_sbsize = super_block_size = 1536;
  837. uspi->s_sbbase = 0;
  838. flags |= UFS_TYPE_UFS2 | UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
  839. break;
  840. case UFS_MOUNT_UFSTYPE_SUN:
  841. UFSD("ufstype=sun\n");
  842. uspi->s_fsize = block_size = 1024;
  843. uspi->s_fmask = ~(1024 - 1);
  844. uspi->s_fshift = 10;
  845. uspi->s_sbsize = super_block_size = 2048;
  846. uspi->s_sbbase = 0;
  847. uspi->s_maxsymlinklen = 0; /* Not supported on disk */
  848. flags |= UFS_DE_OLD | UFS_UID_EFT | UFS_ST_SUN | UFS_CG_SUN;
  849. break;
  850. case UFS_MOUNT_UFSTYPE_SUNOS:
  851. UFSD(("ufstype=sunos\n"))
  852. uspi->s_fsize = block_size = 1024;
  853. uspi->s_fmask = ~(1024 - 1);
  854. uspi->s_fshift = 10;
  855. uspi->s_sbsize = 2048;
  856. super_block_size = 2048;
  857. uspi->s_sbbase = 0;
  858. uspi->s_maxsymlinklen = 0; /* Not supported on disk */
  859. flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_SUNOS | UFS_CG_SUN;
  860. break;
  861. case UFS_MOUNT_UFSTYPE_SUNx86:
  862. UFSD("ufstype=sunx86\n");
  863. uspi->s_fsize = block_size = 1024;
  864. uspi->s_fmask = ~(1024 - 1);
  865. uspi->s_fshift = 10;
  866. uspi->s_sbsize = super_block_size = 2048;
  867. uspi->s_sbbase = 0;
  868. uspi->s_maxsymlinklen = 0; /* Not supported on disk */
  869. flags |= UFS_DE_OLD | UFS_UID_EFT | UFS_ST_SUNx86 | UFS_CG_SUN;
  870. break;
  871. case UFS_MOUNT_UFSTYPE_OLD:
  872. UFSD("ufstype=old\n");
  873. uspi->s_fsize = block_size = 1024;
  874. uspi->s_fmask = ~(1024 - 1);
  875. uspi->s_fshift = 10;
  876. uspi->s_sbsize = super_block_size = 2048;
  877. uspi->s_sbbase = 0;
  878. flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
  879. if (!(sb->s_flags & MS_RDONLY)) {
  880. if (!silent)
  881. printk(KERN_INFO "ufstype=old is supported read-only\n");
  882. sb->s_flags |= MS_RDONLY;
  883. }
  884. break;
  885. case UFS_MOUNT_UFSTYPE_NEXTSTEP:
  886. UFSD("ufstype=nextstep\n");
  887. uspi->s_fsize = block_size = 1024;
  888. uspi->s_fmask = ~(1024 - 1);
  889. uspi->s_fshift = 10;
  890. uspi->s_sbsize = super_block_size = 2048;
  891. uspi->s_sbbase = 0;
  892. uspi->s_dirblksize = 1024;
  893. flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
  894. if (!(sb->s_flags & MS_RDONLY)) {
  895. if (!silent)
  896. printk(KERN_INFO "ufstype=nextstep is supported read-only\n");
  897. sb->s_flags |= MS_RDONLY;
  898. }
  899. break;
  900. case UFS_MOUNT_UFSTYPE_NEXTSTEP_CD:
  901. UFSD("ufstype=nextstep-cd\n");
  902. uspi->s_fsize = block_size = 2048;
  903. uspi->s_fmask = ~(2048 - 1);
  904. uspi->s_fshift = 11;
  905. uspi->s_sbsize = super_block_size = 2048;
  906. uspi->s_sbbase = 0;
  907. uspi->s_dirblksize = 1024;
  908. flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
  909. if (!(sb->s_flags & MS_RDONLY)) {
  910. if (!silent)
  911. printk(KERN_INFO "ufstype=nextstep-cd is supported read-only\n");
  912. sb->s_flags |= MS_RDONLY;
  913. }
  914. break;
  915. case UFS_MOUNT_UFSTYPE_OPENSTEP:
  916. UFSD("ufstype=openstep\n");
  917. uspi->s_fsize = block_size = 1024;
  918. uspi->s_fmask = ~(1024 - 1);
  919. uspi->s_fshift = 10;
  920. uspi->s_sbsize = super_block_size = 2048;
  921. uspi->s_sbbase = 0;
  922. uspi->s_dirblksize = 1024;
  923. flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
  924. if (!(sb->s_flags & MS_RDONLY)) {
  925. if (!silent)
  926. printk(KERN_INFO "ufstype=openstep is supported read-only\n");
  927. sb->s_flags |= MS_RDONLY;
  928. }
  929. break;
  930. case UFS_MOUNT_UFSTYPE_HP:
  931. UFSD("ufstype=hp\n");
  932. uspi->s_fsize = block_size = 1024;
  933. uspi->s_fmask = ~(1024 - 1);
  934. uspi->s_fshift = 10;
  935. uspi->s_sbsize = super_block_size = 2048;
  936. uspi->s_sbbase = 0;
  937. flags |= UFS_DE_OLD | UFS_UID_OLD | UFS_ST_OLD | UFS_CG_OLD;
  938. if (!(sb->s_flags & MS_RDONLY)) {
  939. if (!silent)
  940. printk(KERN_INFO "ufstype=hp is supported read-only\n");
  941. sb->s_flags |= MS_RDONLY;
  942. }
  943. break;
  944. default:
  945. if (!silent)
  946. printk("unknown ufstype\n");
  947. goto failed;
  948. }
  949. again:
  950. /* set block size */
  951. if (block_size > PAGE_SIZE || block_size < 512 ||
  952. !is_power_of_2(block_size))
  953. goto failed;
  954. if (block_size < 512)
  955. goto failed;
  956. sb->s_blocksize = block_size;
  957. sb->s_blocksize_bits = blksize_bits(block_size);
  958. /* Read UFS super block from device */
  959. ubh = ubh_bread_uspi(uspi, sb,
  960. uspi->s_sbbase + super_block_offset/block_size, super_block_size);
  961. if (!ubh)
  962. goto failed;
  963. usb1 = ubh_get_usb_first(uspi);
  964. usb2 = ubh_get_usb_second(uspi);
  965. usb3 = ubh_get_usb_third(uspi);
  966. /* Sort out mod used on SunOS 4.1.3 for fs_state */
  967. uspi->s_postblformat = fs32_to_cpu(sb, usb3->fs_postblformat);
  968. if (((flags & UFS_ST_MASK) == UFS_ST_SUNOS) &&
  969. (uspi->s_postblformat != UFS_42POSTBLFMT)) {
  970. flags &= ~UFS_ST_MASK;
  971. flags |= UFS_ST_SUN;
  972. }
  973. /* Check UFS magic number */
  974. sbi->s_bytesex = BYTESEX_LE;
  975. switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) {
  976. case UFS_MAGIC:
  977. case UFS2_MAGIC:
  978. case UFS_MAGIC_LFN:
  979. case UFS_MAGIC_FEA:
  980. case UFS_MAGIC_4GB:
  981. goto magic_found;
  982. }
  983. sbi->s_bytesex = BYTESEX_BE;
  984. switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) {
  985. case UFS_MAGIC:
  986. case UFS2_MAGIC:
  987. case UFS_MAGIC_LFN:
  988. case UFS_MAGIC_FEA:
  989. case UFS_MAGIC_4GB:
  990. goto magic_found;
  991. }
  992. if ((((sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) ==
  993. UFS_MOUNT_UFSTYPE_NEXTSTEP) ||
  994. ((sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) ==
  995. UFS_MOUNT_UFSTYPE_NEXTSTEP_CD) ||
  996. ((sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) ==
  997. UFS_MOUNT_UFSTYPE_OPENSTEP)) && uspi->s_sbbase < 256) {
  998. ubh_brelse_uspi(uspi);
  999. ubh = NULL;
  1000. uspi->s_sbbase += 8;
  1001. goto again;
  1002. }
  1003. if (!silent)
  1004. printk("ufs_read_super: bad magic number\n");
  1005. goto failed;
  1006. magic_found:
  1007. /* Check block and fragment sizes */
  1008. uspi->s_bsize = fs32_to_cpu(sb, usb1->fs_bsize);
  1009. uspi->s_fsize = fs32_to_cpu(sb, usb1->fs_fsize);
  1010. uspi->s_sbsize = fs32_to_cpu(sb, usb1->fs_sbsize);
  1011. uspi->s_fmask = fs32_to_cpu(sb, usb1->fs_fmask);
  1012. uspi->s_fshift = fs32_to_cpu(sb, usb1->fs_fshift);
  1013. if (!is_power_of_2(uspi->s_fsize)) {
  1014. printk(KERN_ERR
  1015. "ufs_read_super: fragment size %u is not a power of 2\n",
  1016. uspi->s_fsize);
  1017. goto failed;
  1018. }
  1019. if (uspi->s_fsize < 512) {
  1020. printk(KERN_ERR "ufs_read_super: fragment size %u is too small\n",
  1021. uspi->s_fsize);
  1022. goto failed;
  1023. }
  1024. if (uspi->s_fsize > 4096) {
  1025. printk(KERN_ERR "ufs_read_super: fragment size %u is too large\n",
  1026. uspi->s_fsize);
  1027. goto failed;
  1028. }
  1029. if (!is_power_of_2(uspi->s_bsize)) {
  1030. printk(KERN_ERR "ufs_read_super: block size %u is not a power of 2\n",
  1031. uspi->s_bsize);
  1032. goto failed;
  1033. }
  1034. if (uspi->s_bsize < 4096) {
  1035. printk(KERN_ERR "ufs_read_super: block size %u is too small\n",
  1036. uspi->s_bsize);
  1037. goto failed;
  1038. }
  1039. if (uspi->s_bsize / uspi->s_fsize > 8) {
  1040. printk(KERN_ERR "ufs_read_super: too many fragments per block (%u)\n",
  1041. uspi->s_bsize / uspi->s_fsize);
  1042. goto failed;
  1043. }
  1044. if (uspi->s_fsize != block_size || uspi->s_sbsize != super_block_size) {
  1045. ubh_brelse_uspi(uspi);
  1046. ubh = NULL;
  1047. block_size = uspi->s_fsize;
  1048. super_block_size = uspi->s_sbsize;
  1049. UFSD("another value of block_size or super_block_size %u, %u\n",
  1050. block_size, super_block_size);
  1051. goto again;
  1052. }
  1053. sbi->s_flags = flags; /* After this line some functions use s_flags*/
  1054. /* ufs_print_super_stuff(sb, usb1, usb2, usb3); */
  1055. /* Check if file system was unmounted cleanly. Make read-only otherwise. */
  1056. if (((flags & UFS_ST_MASK) == UFS_ST_44BSD) ||
  1057. ((flags & UFS_ST_MASK) == UFS_ST_OLD) ||
  1058. (((flags & UFS_ST_MASK) == UFS_ST_SUN ||
  1059. (flags & UFS_ST_MASK) == UFS_ST_SUNOS ||
  1060. (flags & UFS_ST_MASK) == UFS_ST_SUNx86) &&
  1061. (ufs_get_fs_state(sb, usb1, usb3) ==
  1062. (UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time))))) {
  1063. switch(usb1->fs_clean) {
  1064. case UFS_FSCLEAN:
  1065. UFSD("fs is clean\n");
  1066. break;
  1067. case UFS_FSSTABLE:
  1068. UFSD("fs is stable\n");
  1069. break;
  1070. case UFS_FSOSF1:
  1071. UFSD("fs is DEC OSF/1\n");
  1072. break;
  1073. case UFS_FSACTIVE:
  1074. printk("ufs_read_super: fs is active\n");
  1075. sb->s_flags |= MS_RDONLY;
  1076. break;
  1077. case UFS_FSBAD:
  1078. printk("ufs_read_super: fs is bad\n");
  1079. sb->s_flags |= MS_RDONLY;
  1080. break;
  1081. default:
  1082. printk("ufs_read_super: can't grok fs_clean 0x%x\n",
  1083. usb1->fs_clean);
  1084. sb->s_flags |= MS_RDONLY;
  1085. break;
  1086. }
  1087. } else {
  1088. printk("ufs_read_super: fs needs fsck\n");
  1089. sb->s_flags |= MS_RDONLY;
  1090. }
  1091. /* Read ufs_super_block into internal data structures */
  1092. sb->s_magic = fs32_to_cpu(sb, usb3->fs_magic);
  1093. uspi->s_sblkno = fs32_to_cpu(sb, usb1->fs_sblkno);
  1094. uspi->s_cblkno = fs32_to_cpu(sb, usb1->fs_cblkno);
  1095. uspi->s_iblkno = fs32_to_cpu(sb, usb1->fs_iblkno);
  1096. uspi->s_dblkno = fs32_to_cpu(sb, usb1->fs_dblkno);
  1097. uspi->s_cgoffset = fs32_to_cpu(sb, usb1->fs_cgoffset);
  1098. uspi->s_cgmask = fs32_to_cpu(sb, usb1->fs_cgmask);
  1099. if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
  1100. uspi->s_u2_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size);
  1101. uspi->s_u2_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize);
  1102. } else {
  1103. uspi->s_size = fs32_to_cpu(sb, usb1->fs_size);
  1104. uspi->s_dsize = fs32_to_cpu(sb, usb1->fs_dsize);
  1105. }
  1106. uspi->s_ncg = fs32_to_cpu(sb, usb1->fs_ncg);
  1107. /* s_bsize already set */
  1108. /* s_fsize already set */
  1109. uspi->s_fpb = fs32_to_cpu(sb, usb1->fs_frag);
  1110. uspi->s_minfree = fs32_to_cpu(sb, usb1->fs_minfree);
  1111. uspi->s_bmask = fs32_to_cpu(sb, usb1->fs_bmask);
  1112. uspi->s_fmask = fs32_to_cpu(sb, usb1->fs_fmask);
  1113. uspi->s_bshift = fs32_to_cpu(sb, usb1->fs_bshift);
  1114. uspi->s_fshift = fs32_to_cpu(sb, usb1->fs_fshift);
  1115. UFSD("uspi->s_bshift = %d,uspi->s_fshift = %d", uspi->s_bshift,
  1116. uspi->s_fshift);
  1117. uspi->s_fpbshift = fs32_to_cpu(sb, usb1->fs_fragshift);
  1118. uspi->s_fsbtodb = fs32_to_cpu(sb, usb1->fs_fsbtodb);
  1119. /* s_sbsize already set */
  1120. uspi->s_csmask = fs32_to_cpu(sb, usb1->fs_csmask);
  1121. uspi->s_csshift = fs32_to_cpu(sb, usb1->fs_csshift);
  1122. uspi->s_nindir = fs32_to_cpu(sb, usb1->fs_nindir);
  1123. uspi->s_inopb = fs32_to_cpu(sb, usb1->fs_inopb);
  1124. uspi->s_nspf = fs32_to_cpu(sb, usb1->fs_nspf);
  1125. uspi->s_npsect = ufs_get_fs_npsect(sb, usb1, usb3);
  1126. uspi->s_interleave = fs32_to_cpu(sb, usb1->fs_interleave);
  1127. uspi->s_trackskew = fs32_to_cpu(sb, usb1->fs_trackskew);
  1128. if (uspi->fs_magic == UFS2_MAGIC)
  1129. uspi->s_csaddr = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_csaddr);
  1130. else
  1131. uspi->s_csaddr = fs32_to_cpu(sb, usb1->fs_csaddr);
  1132. uspi->s_cssize = fs32_to_cpu(sb, usb1->fs_cssize);
  1133. uspi->s_cgsize = fs32_to_cpu(sb, usb1->fs_cgsize);
  1134. uspi->s_ntrak = fs32_to_cpu(sb, usb1->fs_ntrak);
  1135. uspi->s_nsect = fs32_to_cpu(sb, usb1->fs_nsect);
  1136. uspi->s_spc = fs32_to_cpu(sb, usb1->fs_spc);
  1137. uspi->s_ipg = fs32_to_cpu(sb, usb1->fs_ipg);
  1138. uspi->s_fpg = fs32_to_cpu(sb, usb1->fs_fpg);
  1139. uspi->s_cpc = fs32_to_cpu(sb, usb2->fs_un.fs_u1.fs_cpc);
  1140. uspi->s_contigsumsize = fs32_to_cpu(sb,
  1141. usb3->fs_un2.fs_44.fs_contigsumsize);
  1142. uspi->s_qbmask = ufs_get_fs_qbmask(sb, usb3);
  1143. uspi->s_qfmask = ufs_get_fs_qfmask(sb, usb3);
  1144. uspi->s_nrpos = fs32_to_cpu(sb, usb3->fs_nrpos);
  1145. uspi->s_postbloff = fs32_to_cpu(sb, usb3->fs_postbloff);
  1146. uspi->s_rotbloff = fs32_to_cpu(sb, usb3->fs_rotbloff);
  1147. /* Compute another frequently used values */
  1148. uspi->s_fpbmask = uspi->s_fpb - 1;
  1149. if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2)
  1150. uspi->s_apbshift = uspi->s_bshift - 3;
  1151. else
  1152. uspi->s_apbshift = uspi->s_bshift - 2;
  1153. uspi->s_2apbshift = uspi->s_apbshift * 2;
  1154. uspi->s_3apbshift = uspi->s_apbshift * 3;
  1155. uspi->s_apb = 1 << uspi->s_apbshift;
  1156. uspi->s_2apb = 1 << uspi->s_2apbshift;
  1157. uspi->s_3apb = 1 << uspi->s_3apbshift;
  1158. uspi->s_apbmask = uspi->s_apb - 1;
  1159. uspi->s_nspfshift = uspi->s_fshift - UFS_SECTOR_BITS;
  1160. uspi->s_nspb = uspi->s_nspf << uspi->s_fpbshift;
  1161. uspi->s_inopf = uspi->s_inopb >> uspi->s_fpbshift;
  1162. uspi->s_bpf = uspi->s_fsize << 3;
  1163. uspi->s_bpfshift = uspi->s_fshift + 3;
  1164. uspi->s_bpfmask = uspi->s_bpf - 1;
  1165. if ((sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) == UFS_MOUNT_UFSTYPE_44BSD ||
  1166. (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) == UFS_MOUNT_UFSTYPE_UFS2)
  1167. uspi->s_maxsymlinklen =
  1168. fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_maxsymlinklen);
  1169. ufs_setup_cstotal(sb);
  1170. /* Read cylinder group structures */
  1171. if (!(sb->s_flags & MS_RDONLY))
  1172. if (!ufs_read_cylinder_structures(sb))
  1173. goto failed;
  1174. /*
  1175. * ufs_read_cylinder_structures(sb);
  1176. */
  1177. UFSD("EXIT\n");
  1178. return sb;
  1179. failed:
  1180. if (ubh)
  1181. ubh_brelse_uspi(uspi);
  1182. kfree(uspi);
  1183. kfree(sbi);
  1184. sb->s_fs_info = NULL;
  1185. UFSD("EXIT (FAILED)\n");
  1186. return NULL;
  1187. failed_nomem:
  1188. UFSD("EXIT (NOMEM)\n");
  1189. return NULL;
  1190. }
  1191. int
  1192. U_ufs_statvfs(struct super_block* sb, struct statvfs* buf)
  1193. {
  1194. struct ufs_sb_private_info *uspi= UFS_SB(sb)->s_uspi;
  1195. unsigned flags = UFS_SB(sb)->s_flags;
  1196. struct ufs_super_block_first* usb1;
  1197. struct ufs_super_block_second* usb2;
  1198. struct ufs_super_block_third* usb3;
  1199. lock_kernel();
  1200. usb1 = ubh_get_usb_first(uspi);
  1201. usb2 = ubh_get_usb_second(uspi);
  1202. usb3 = ubh_get_usb_third(uspi);
  1203. if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
  1204. /* buf->f_type = UFS2_MAGIC; */
  1205. buf->f_blocks = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize);
  1206. } else {
  1207. /* buf->f_type = UFS_MAGIC; */
  1208. buf->f_blocks = uspi->s_dsize;
  1209. }
  1210. buf->f_bfree = ufs_blkstofrags(uspi->cs_total.cs_nbfree) +
  1211. uspi->cs_total.cs_nffree;
  1212. buf->f_ffree = uspi->cs_total.cs_nifree;
  1213. buf->f_bavail =
  1214. (buf->f_bfree > (((long)buf->f_blocks / 100) * uspi->s_minfree))
  1215. ? (buf->f_bfree - (((long)buf->f_blocks / 100) * uspi->s_minfree)) : 0;
  1216. buf->f_files = uspi->s_ncg * uspi->s_ipg;
  1217. buf->f_namemax = UFS_MAXNAMLEN;
  1218. buf->f_frsize = sb->s_blocksize;
  1219. buf->f_bsize = fs32_to_cpu(sb, usb1->fs_bsize);
  1220. unlock_kernel();
  1221. return 0;
  1222. }
  1223. int
  1224. U_ufs_iget(struct super_block* sb, struct inode* inode)
  1225. {
  1226. struct ufs_inode_info* ufsi;
  1227. struct ufs_sb_private_info* uspi = UFS_SB(sb)->s_uspi;
  1228. int err;
  1229. unsigned long ino = inode->I_ino;
  1230. UFSD("ENTER, ino %lu\n", ino);
  1231. if (ino < UFS_ROOTINO || ino > (uspi->s_ncg * uspi->s_ipg)) {
  1232. fprintf(stderr, "ufs_read_inode: bad inode number (%lu)\n", ino);
  1233. return EIO;
  1234. }
  1235. inode->I_sb = sb;
  1236. inode->I_blkbits = sb->s_blocksize_bits;
  1237. inode->I_nlink = 1;
  1238. ufsi = inode->I_private;
  1239. ufsi->i_unused1 = 0;
  1240. ufsi->i_dir_start_lookup = 0;
  1241. struct buffer_head _bh;
  1242. struct buffer_head* bh = &_bh;
  1243. bh->b_flags.dynamic = 0;
  1244. if (sb_bread_intobh(sb, uspi->s_sbbase +
  1245. ufs_inotofsba(inode->I_ino), bh) != 0) {
  1246. fprintf(stderr,
  1247. "ufs_read_inode: unable to read inode %llu\n", inode->I_ino);
  1248. goto bad_inode;
  1249. }
  1250. if ((UFS_SB(sb)->s_flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
  1251. struct ufs2_inode* ufs2_inode = (struct ufs2_inode*)bh->b_data;
  1252. err = ufs2_read_inode(inode, ufs2_inode + ufs_inotofsbo(inode->I_ino));
  1253. } else {
  1254. struct ufs_inode* ufs_inode = (struct ufs_inode*)bh->b_data;
  1255. err = ufs1_read_inode(inode, ufs_inode + ufs_inotofsbo(inode->I_ino));
  1256. }
  1257. if (err)
  1258. goto bad_inode;
  1259. inode->I_version++;
  1260. ufsi->i_lastfrag = (inode->I_size + uspi->s_fsize - 1) >> uspi->s_fshift;
  1261. ufsi->i_osync = 0;
  1262. brelse(bh);
  1263. UFSD("EXIT\n");
  1264. return 0;
  1265. bad_inode:
  1266. return -1;
  1267. }
  1268. ino_t
  1269. U_ufs_inode_by_name(struct inode* dir, const char* name)
  1270. {
  1271. return ufs_find_entry_s(dir, name);
  1272. }
  1273. int
  1274. U_ufs_next_direntry(struct inode* dir, struct unixfs_dirbuf* dirpagebuf,
  1275. off_t* offset, struct unixfs_direntry* dent)
  1276. {
  1277. struct super_block* sb = dir->I_sb;
  1278. struct ufs_inode_info* ui = dir->I_private;
  1279. unsigned long npages = ufs_dir_pages(dir);
  1280. unsigned long start, n;
  1281. struct ufs_dir_entry* de;
  1282. UFSD("ENTER, dir_ino %llu\n", dir->I_ino);
  1283. if (*offset > (dir->I_size - UFS_DIR_REC_LEN(1)))
  1284. return -1;
  1285. if (npages == 0)
  1286. return -1;
  1287. start = ui->i_dir_start_lookup;
  1288. n = start;
  1289. if (start > npages)
  1290. return -1;
  1291. if ((ui->i_unused1 == 0) || (*offset & ((PAGE_SIZE - 1))) == 0) {
  1292. int ret = ufs_get_dirpage(dir, n, dirpagebuf->data);
  1293. if (ret != 0)
  1294. return ret;
  1295. ui->i_dir_start_lookup++;
  1296. ui->i_unused1 = ui->i_dir_start_lookup;
  1297. }
  1298. de = (struct ufs_dir_entry*)((char*)dirpagebuf->data +
  1299. (*offset & (PAGE_SIZE - 1)));
  1300. dent->ino = fs32_to_cpu(sb, de->d_ino);
  1301. size_t nl = ufs_get_de_namlen(sb, de);;
  1302. memcpy(dent->name, de->d_name, nl);
  1303. dent->name[nl] = '\0';
  1304. *offset += fs16_to_cpu(sb, de->d_reclen);
  1305. return 0;
  1306. }
  1307. /* Interface between UFS and read/write page. */
  1308. int
  1309. U_ufs_get_block(struct inode* inode, sector_t fragment, off_t* result)
  1310. {
  1311. int ret;
  1312. struct buffer_head bh;
  1313. if ((ret = ufs_getfrag_block(inode, fragment, &bh, 0)) == 0)
  1314. *result = bh.b_blocknr;
  1315. else
  1316. *result = 0;
  1317. return ret;
  1318. }
  1319. int
  1320. U_ufs_get_page(struct inode* inode, sector_t index, char* pagebuf)
  1321. {
  1322. sector_t iblock, lblock;
  1323. unsigned int blocksize;
  1324. int nr, i;
  1325. blocksize = 1 << inode->I_blkbits;
  1326. iblock = index << (PAGE_CACHE_SHIFT - inode->I_blkbits);
  1327. lblock = (inode->I_size + blocksize - 1) >> inode->I_blkbits;
  1328. nr = 0;
  1329. i = 0;
  1330. int bytes = 0, err = 0;
  1331. struct super_block* sb = inode->I_sb;
  1332. struct buffer_head _bh;
  1333. char* p = pagebuf;
  1334. do {
  1335. u64 phys64 = ufs_frag_map(inode, iblock, &err);
  1336. if (phys64) {
  1337. struct buffer_head* bh = &_bh;
  1338. bh->b_flags.dynamic = 0;
  1339. if (sb_bread_intobh(sb, phys64, bh) == 0) {
  1340. memcpy(p, bh->b_data, blocksize);
  1341. p += blocksize;
  1342. bytes += blocksize;
  1343. brelse(bh);
  1344. } else {
  1345. err = EIO;
  1346. fprintf(stderr, "*** fatal error: I/O error reading page\n");
  1347. abort();
  1348. exit(10);
  1349. }
  1350. } else { /* zero fill */
  1351. memset(p, 0, blocksize);
  1352. p += blocksize;
  1353. bytes += blocksize;
  1354. }
  1355. if ((bytes >= PAGE_SIZE) || (iblock >= lblock))
  1356. break;
  1357. iblock++;
  1358. } while (1);
  1359. if (err)
  1360. return -1;
  1361. /* check page? */
  1362. return 0;
  1363. }