diff options
author | Roland McGrath <roland@gnu.org> | 2000-02-04 03:21:18 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2000-02-04 03:21:18 +0000 |
commit | 8880a73970b23f10c720011cb910c0e0e1e02975 (patch) | |
tree | d1ce76577a1ace5312fc0576a93d4d8db1e89323 /pfinet/linux-src/include/linux/adfs_fs.h | |
parent | 8399aa4ab7b849da57f4c59039f091526c9e2f98 (diff) | |
parent | 9fd51e9b0ad33a89a83fdbbb66bd20d85f7893fb (diff) | |
download | hurd-8880a73970b23f10c720011cb910c0e0e1e02975.tar.gz hurd-8880a73970b23f10c720011cb910c0e0e1e02975.tar.bz2 hurd-8880a73970b23f10c720011cb910c0e0e1e02975.zip |
Merge from vendor branch Linux:
Import of Linux 2.2.12 subset (ipv4 stack and related)
Diffstat (limited to 'pfinet/linux-src/include/linux/adfs_fs.h')
-rw-r--r-- | pfinet/linux-src/include/linux/adfs_fs.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/pfinet/linux-src/include/linux/adfs_fs.h b/pfinet/linux-src/include/linux/adfs_fs.h new file mode 100644 index 00000000..f6ed2d3b --- /dev/null +++ b/pfinet/linux-src/include/linux/adfs_fs.h @@ -0,0 +1,175 @@ +#ifndef _ADFS_FS_H +#define _ADFS_FS_H + +#include <linux/types.h> +/* + * Structures of data on the disk + */ + +/* + * Disc Record at disc address 0xc00 + */ +struct adfs_discrecord { + unsigned char log2secsize; + unsigned char secspertrack; + unsigned char heads; + unsigned char density; + unsigned char idlen; + unsigned char log2bpmb; + unsigned char skew; + unsigned char bootoption; + unsigned char lowsector; + unsigned char nzones; + unsigned short zone_spare; + unsigned long root; + unsigned long disc_size; + unsigned short disc_id; + unsigned char disc_name[10]; + unsigned long disc_type; + unsigned long disc_size_high; + unsigned char log2sharesize:4; + unsigned char unused:4; + unsigned char big_flag:1; +}; + +#define ADFS_DISCRECORD (0xc00) +#define ADFS_DR_OFFSET (0x1c0) +#define ADFS_DR_SIZE 60 +#define ADFS_SUPER_MAGIC 0xadf5 +#define ADFS_FREE_FRAG 0 +#define ADFS_BAD_FRAG 1 +#define ADFS_ROOT_FRAG 2 + +/* + * Directory header + */ +struct adfs_dirheader { + unsigned char startmasseq; + unsigned char startname[4]; +}; + +#define ADFS_NEWDIR_SIZE 2048 +#define ADFS_OLDDIR_SIZE 1024 +#define ADFS_NUM_DIR_ENTRIES 77 + +/* + * Directory entries + */ +struct adfs_direntry { + char dirobname[10]; +#define ADFS_NAME_LEN 10 + __u8 dirload[4]; + __u8 direxec[4]; + __u8 dirlen[4]; + __u8 dirinddiscadd[3]; + __u8 newdiratts; +#define ADFS_NDA_OWNER_READ (1 << 0) +#define ADFS_NDA_OWNER_WRITE (1 << 1) +#define ADFS_NDA_LOCKED (1 << 2) +#define ADFS_NDA_DIRECTORY (1 << 3) +#define ADFS_NDA_EXECUTE (1 << 4) +#define ADFS_NDA_PUBLIC_READ (1 << 5) +#define ADFS_NDA_PUBLIC_WRITE (1 << 6) +}; + +#define ADFS_MAX_NAME_LEN 255 +struct adfs_idir_entry { + __u32 inode_no; /* Address */ + __u32 file_id; /* file id */ + __u32 name_len; /* name length */ + __u32 size; /* size */ + __u32 mtime; /* modification time */ + __u32 filetype; /* RiscOS file type */ + __u8 mode; /* internal mode */ + char name[ADFS_MAX_NAME_LEN]; /* file name */ +}; + +/* + * Directory tail + */ +union adfs_dirtail { + struct { + unsigned char dirlastmask; + char dirname[10]; + unsigned char dirparent[3]; + char dirtitle[19]; + unsigned char reserved[14]; + unsigned char endmasseq; + unsigned char endname[4]; + unsigned char dircheckbyte; + } old; + struct { + unsigned char dirlastmask; + unsigned char reserved[2]; + unsigned char dirparent[3]; + char dirtitle[19]; + char dirname[10]; + unsigned char endmasseq; + unsigned char endname[4]; + unsigned char dircheckbyte; + } new; +}; + +#ifdef __KERNEL__ +/* + * Calculate the boot block checksum on an ADFS drive. Note that this will + * appear to be correct if the sector contains all zeros, so also check that + * the disk size is non-zero!!! + */ +extern inline int adfs_checkbblk(unsigned char *ptr) +{ + unsigned int result = 0; + unsigned char *p = ptr + 511; + + do { + result = (result & 0xff) + (result >> 8); + result = result + *--p; + } while (p != ptr); + + return (result & 0xff) != ptr[511]; +} + +/* dir.c */ +extern unsigned int adfs_val (unsigned char *p, int len); +extern int adfs_dir_read_parent (struct inode *inode, struct buffer_head **bhp); +extern int adfs_dir_read (struct inode *inode, struct buffer_head **bhp); +extern int adfs_dir_check (struct inode *inode, struct buffer_head **bhp, + int buffers, union adfs_dirtail *dtp); +extern void adfs_dir_free (struct buffer_head **bhp, int buffers); +extern int adfs_dir_get (struct super_block *sb, struct buffer_head **bhp, + int buffers, int pos, unsigned long parent_object_id, + struct adfs_idir_entry *ide); +extern int adfs_dir_find_entry (struct super_block *sb, struct buffer_head **bhp, + int buffers, unsigned int index, + struct adfs_idir_entry *ide); + +/* inode.c */ +extern int adfs_inode_validate (struct inode *inode); +extern unsigned long adfs_inode_generate (unsigned long parent_id, int diridx); +extern unsigned long adfs_inode_objid (struct inode *inode); +extern unsigned int adfs_parent_bmap (struct inode *inode, int block); +extern int adfs_bmap (struct inode *inode, int block); +extern void adfs_read_inode (struct inode *inode); + +/* map.c */ +extern int adfs_map_lookup (struct super_block *sb, int frag_id, int offset); + +/* namei.c */ +extern struct dentry *adfs_lookup (struct inode *dir, struct dentry *dentry); + +/* super.c */ +extern int init_adfs_fs (void); +extern void adfs_error (struct super_block *, const char *, const char *, ...); + +/* + * Inodes and file operations + */ + +/* dir.c */ +extern struct inode_operations adfs_dir_inode_operations; + +/* file.c */ +extern struct inode_operations adfs_file_inode_operations; +#endif + +#endif |