Lines Matching refs:fs
135 #define bytsec(fs, n) ((n) >> (fs)->sshift) argument
136 #define secbyt(fs, s) ((s) << (fs)->sshift) argument
137 #define depsec(fs) (1U << (fs)->dshift) argument
138 #define entsec(fs, e) ((e) >> (fs)->dshift) argument
139 #define bytblk(fs, n) ((n) >> (fs)->bshift) argument
140 #define blkbyt(fs, b) ((b) << (fs)->bshift) argument
141 #define secblk(fs, s) ((s) >> ((fs)->bshift - (fs)->sshift)) argument
142 #define blksec(fs, b) ((b) << ((fs)->bshift - (fs)->sshift)) argument
145 #define blkoff(fs, b) (secbyt(fs, (fs)->lsndta) + \ argument
146 blkbyt(fs, (b) - LOCLUS))
149 #define blklsn(fs, b) ((fs)->lsndta + blksec(fs, (b) - LOCLUS)) argument
157 #define okclus(fs, c) ((c) >= LOCLUS && (c) <= (fs)->xclus) argument
177 dos_read_fatblk(DOS_FS *fs, uint_t blknum) in dos_read_fatblk() argument
190 max_offset_in_fat = secbyt(fs, (daddr_t)fs->spf); in dos_read_fatblk()
197 err = ioget(fs, fs->lsnfat + bytsec(fs, offset_in_fat), in dos_read_fatblk()
198 fs->fatbuf, io_size); in dos_read_fatblk()
200 fs->fatbuf_blknum = ((uint_t)(-1)); in dos_read_fatblk()
206 memset(fs->fatbuf + io_size, 0, FATBLKSZ - io_size); in dos_read_fatblk()
208 fs->fatbuf_blknum = blknum; in dos_read_fatblk()
221 DOS_FS *fs; in dos_mount() local
224 fs = calloc(1, sizeof (DOS_FS)); in dos_mount()
225 if (fs == NULL) in dos_mount()
227 fs->fd = fd; in dos_mount()
231 free(fs); in dos_mount()
237 free(fs); in dos_mount()
241 if ((err = ioget(fs, 0, buf, secsz)) || in dos_mount()
242 (err = parsebs(fs, (DOS_BS *)buf))) { in dos_mount()
244 free(fs); in dos_mount()
247 fs->secbuf = buf; in dos_mount()
249 fs->fatbuf = malloc(FATBLKSZ); in dos_mount()
250 if (fs->fatbuf == NULL) { in dos_mount()
252 free(fs); in dos_mount()
255 err = dos_read_fatblk(fs, 0); in dos_mount()
257 free(fs->fatbuf); in dos_mount()
259 free(fs); in dos_mount()
263 fs->root = dot[0]; in dos_mount()
264 fs->root.name[0] = ' '; in dos_mount()
265 if (fs->fatsz == 32) { in dos_mount()
266 fs->root.clus[0] = fs->rdcl & 0xff; in dos_mount()
267 fs->root.clus[1] = (fs->rdcl >> 8) & 0xff; in dos_mount()
268 fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff; in dos_mount()
269 fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff; in dos_mount()
271 *fsp = fs; in dos_mount()
279 dos_unmount(DOS_FS *fs) in dos_unmount() argument
281 if (fs->links) in dos_unmount()
283 free(fs->secbuf); in dos_unmount()
284 free(fs->fatbuf); in dos_unmount()
285 free(fs); in dos_unmount()
297 DOS_FS *fs; in dos_open() local
301 if ((err = dos_mount(&fs, fd))) { in dos_open()
305 if ((err = namede(fs, path, &de))) { in dos_open()
306 dos_unmount(fs); in dos_open()
310 clus = stclus(fs->fatsz, de); in dos_open()
315 (clus && !okclus(fs, clus))) { in dos_open()
316 dos_unmount(fs); in dos_open()
321 dos_unmount(fs); in dos_open()
325 f->fs = fs; in dos_open()
326 fs->links++; in dos_open()
353 if ((size = fsize(f->fs, &f->de)) == -1) in dos_read()
358 if ((clus = stclus(f->fs->fatsz, &f->de))) in dos_read()
359 off &= f->fs->bsize - 1; in dos_read()
366 n = bytblk(f->fs, f->offset); in dos_read()
370 if ((err = fatget(f->fs, &c))) in dos_read()
372 if (!okclus(f->fs, c)) { in dos_read()
377 if (!clus || (n = f->fs->bsize - off) > cnt) in dos_read()
380 off += blkoff(f->fs, (uint64_t)c); in dos_read()
382 off += secbyt(f->fs, f->fs->lsndir); in dos_read()
383 err = ioread(f->fs, off, buf, n); in dos_read()
440 DOS_FS *fs = f->fs; in dos_close() local
442 f->fs->links--; in dos_close()
444 dos_unmount(fs); in dos_close()
461 if ((sb->st_size = fsize(f->fs, &f->de)) == -1) in dos_stat()
559 parsebs(DOS_FS *fs, DOS_BS *bs) in parsebs() argument
572 fs->sshift = ffs(cv2(bs->bpb.secsiz)) - 1; in parsebs()
579 if (!(fs->spc = bs->bpb.spc) || fs->spc & (fs->spc - 1)) in parsebs()
581 fs->bsize = secbyt(fs, fs->spc); in parsebs()
582 fs->bshift = ffs(fs->bsize) - 1; in parsebs()
583 fs->dshift = ffs(secbyt(fs, 1) / sizeof (DOS_DE)) - 1; in parsebs()
584 fs->dirents = cv2(bs->bpb.dirents); in parsebs()
585 fs->spf = cv2(bs->bpb.spf); in parsebs()
586 fs->lsnfat = cv2(bs->bpb.ressec); in parsebs()
588 if (fs->spf != 0) { in parsebs()
591 if (fs->dirents == 0) in parsebs()
594 fs->spf = cv4(bs->bpb.fstype.f32.lspf); in parsebs()
595 if (fs->spf == 0) in parsebs()
599 fs->rdcl = cv4(bs->bpb.fstype.f32.rdcl); in parsebs()
600 if (fs->rdcl < LOCLUS) in parsebs()
604 RootDirSectors = ((fs->dirents * sizeof (DOS_DE)) + in parsebs()
605 (secbyt(fs, 1) - 1)) / secbyt(fs, 1); in parsebs()
607 fs->lsndir = fs->lsnfat + fs->spf * bs->bpb.fats; in parsebs()
608 fs->lsndta = fs->lsndir + RootDirSectors; in parsebs()
611 if (fs->lsndta > sc) in parsebs()
613 if ((fs->xclus = secblk(fs, sc - fs->lsndta) + 1) < LOCLUS) in parsebs()
615 fs->fatsz = fs->dirents ? fs->xclus < 0xff6 ? 12 : 16 : 32; in parsebs()
616 sc = (secbyt(fs, fs->spf) << 1) / (fs->fatsz >> 2) - 1; in parsebs()
617 if (fs->xclus > sc) in parsebs()
618 fs->xclus = sc; in parsebs()
626 namede(DOS_FS *fs, const char *path, DOS_DE **dep) in namede() argument
635 de = &fs->root; in namede()
650 if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de))) in namede()
661 lookup(DOS_FS *fs, uint_t clus, const char *name, DOS_DE **dep) in lookup() argument
675 if (!clus && fs->fatsz == 32) in lookup()
676 clus = fs->rdcl; in lookup()
677 nsec = !clus ? entsec(fs, fs->dirents) : fs->spc; in lookup()
680 dir = (DOS_DIR *)fs->secbuf; in lookup()
683 lsec = fs->lsndir; in lookup()
684 else if (okclus(fs, clus)) in lookup()
685 lsec = blklsn(fs, clus); in lookup()
690 if ((err = ioget(fs, lsec + sec, dir, in lookup()
691 secbyt(fs, 1)))) in lookup()
693 for (ent = 0; ent < depsec(fs); ent++) { in lookup()
740 if ((err = fatget(fs, &clus))) in lookup()
742 if (fatend(fs->fatsz, clus)) in lookup()
810 fsize(DOS_FS *fs, DOS_DE *de) in fsize() argument
817 if (!(c = stclus(fs->fatsz, de))) in fsize()
818 size = fs->dirents * sizeof (DOS_DE); in fsize()
820 if ((n = fatcnt(fs, c)) == -1) in fsize()
822 size = blkbyt(fs, n); in fsize()
832 fatcnt(DOS_FS *fs, uint_t c) in fatcnt() argument
836 for (n = 0; okclus(fs, c); n++) in fatcnt()
837 if (fatget(fs, &c)) in fatcnt()
839 return (fatend(fs->fatsz, c) ? n : -1); in fatcnt()
847 fatget(DOS_FS *fs, uint_t *c) in fatget() argument
859 offset = fatoff(fs->fatsz, val_in); in fatget()
860 nbyte = fs->fatsz != 32 ? 2 : 4; in fatget()
861 if (offset + nbyte > secbyt(fs, fs->spf)) in fatget()
867 if (blknum != fs->fatbuf_blknum) { in fatget()
868 err = dos_read_fatblk(fs, blknum); in fatget()
872 p_entry = fs->fatbuf + offset; in fatget()
875 switch (fs->fatsz) { in fatget()
910 ioread(DOS_FS *fs, uint64_t offset, void *buf, size_t nbyte) in ioread() argument
917 secsiz = secbyt(fs, 1); in ioread()
923 err = ioget(fs, bytsec(fs, offset), fs->secbuf, secsiz); in ioread()
926 memcpy(s, fs->secbuf + off, n); in ioread()
933 if ((err = ioget(fs, bytsec(fs, offset), s, nbyte))) in ioread()
939 err = ioget(fs, bytsec(fs, offset), fs->secbuf, secsiz); in ioread()
942 memcpy(s, fs->secbuf, n); in ioread()
952 ioget(DOS_FS *fs, daddr_t lsec, void *buf, size_t size) in ioget() argument
956 struct open_file *fd = fs->fd; in ioget()
961 lsec = secbyt(fs, lsec) >> 9; in ioget()