Date: Thu, 25 Aug 2005 14:40:17 +0200 From: des@des.no (=?iso-8859-1?q?Dag-Erling_Sm=F8rgrav?=) To: Bruce Evans <bde@zeta.org.au> Cc: Mikhail Teterin <mi+mx@aldan.algebra.com>, questions@FreeBSD.org, standards@FreeBSD.org Subject: Re: very big files on cd9660 file system Message-ID: <86y86qrxzi.fsf@xps.des.no> In-Reply-To: <863boytdbi.fsf@xps.des.no> (Dag-Erling =?iso-8859-1?q?Sm=F8rgrav's?= message of "Thu, 25 Aug 2005 14:23:45 %2B0200") References: <200508191942.26723.mi%2Bmx@aldan.algebra.com> <20050820142802.E60211@delplex.bde.org> <863boytdbi.fsf@xps.des.no>
next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-= Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable The attached patch should make the isonum functions in iso.h much clearer. It also gets rid of the optimizated versions; I trust the compiler to take care of that. The inode number situation can be improved by dividing the byte offset of the directory entry by a suitable number guaranteed not to be larger than the size in bytes of any directory entry, e.g. 32 (IIUC, a directory entry contains at least 33 bytes of metadata and padding in addition to the file name) DES --=20 Dag-Erling Sm=F8rgrav - des@des.no --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=iso9660.diff Index: sys/isofs/cd9660/iso.h =================================================================== RCS file: /home/ncvs/src/sys/isofs/cd9660/iso.h,v retrieving revision 1.30 diff -u -r1.30 iso.h --- sys/isofs/cd9660/iso.h 14 Mar 2005 13:22:41 -0000 1.30 +++ sys/isofs/cd9660/iso.h 25 Aug 2005 12:33:44 -0000 @@ -277,79 +277,65 @@ * outside the kernel. Thus we don't hide them here. */ -static __inline int isonum_711(u_char *); -static __inline int -isonum_711(p) - u_char *p; +/* + * 7xy + * x -> 1 = 8 bits, 2 = 16 bits, 3 = 32 bits + * y -> 1 = little-endian, 2 = big-endian, 3 = both (le then be) + */ + +static __inline uint8_t +isonum_711(unsigned char *p) { - return *p; + return p[0]; } -static __inline int isonum_712(char *); -static __inline int -isonum_712(p) - char *p; +static __inline uint8_t +isonum_712(unsigned char *p) { - return *p; + return p[0]; } -#ifndef UNALIGNED_ACCESS - -static __inline int isonum_723(u_char *); -static __inline int -isonum_723(p) - u_char *p; +static __inline uint8_t +isonum_713(unsigned char *p) { - return *p|(p[1] << 8); + return p[0]; } -static __inline int isonum_733(u_char *); -static __inline int -isonum_733(p) - u_char *p; +static __inline uint16_t +isonum_721(unsigned char *p) { - return *p|(p[1] << 8)|(p[2] << 16)|(p[3] << 24); + return (p[0] | p[1] << 8); } -#else /* UNALIGNED_ACCESS */ - -#if BYTE_ORDER == LITTLE_ENDIAN - -static __inline int -isonum_723(p) - u_char *p +static __inline uint16_t +isonum_722(unsigned char *p) { - return *(u_int16t *)p; + return (p[1] | p[0] << 8); } -static __inline int -isonum_733(p) - u_char *p; +static __inline uint16_t +isonum_723(unsigned char *p) { - return *(u_int32t *)p; + return (p[0] | p[1] << 8); } -#endif - -#if BYTE_ORDER == BIG_ENDIAN - -static __inline int -isonum_723(p) - u_char *p +static __inline uint32_t +isonum_731(unsigned char *p) { - return *(u_int16t *)(p + 2); + return (p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24); } -static __inline int -isonum_733(p) - u_char *p; +static __inline uint32_t +isonum_732(unsigned char *p) { - return *(u_int32t *)(p + 4); + return (p[3] | p[2] << 8 | p[1] << 16 | p[0] << 24); } -#endif - -#endif /* UNALIGNED_ACCESS */ +static __inline uint32_t +isonum_733(unsigned char *p) +{ + return (p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24); +} /* * Associated files have a leading '='. --=-=-=--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86y86qrxzi.fsf>