11da177e4SLinus Torvalds /* Internal data structures for ADFS */ 21da177e4SLinus Torvalds 31da177e4SLinus Torvalds #define ADFS_FREE_FRAG 0 41da177e4SLinus Torvalds #define ADFS_BAD_FRAG 1 51da177e4SLinus Torvalds #define ADFS_ROOT_FRAG 2 61da177e4SLinus Torvalds 71da177e4SLinus Torvalds #define ADFS_NDA_OWNER_READ (1 << 0) 81da177e4SLinus Torvalds #define ADFS_NDA_OWNER_WRITE (1 << 1) 91da177e4SLinus Torvalds #define ADFS_NDA_LOCKED (1 << 2) 101da177e4SLinus Torvalds #define ADFS_NDA_DIRECTORY (1 << 3) 111da177e4SLinus Torvalds #define ADFS_NDA_EXECUTE (1 << 4) 121da177e4SLinus Torvalds #define ADFS_NDA_PUBLIC_READ (1 << 5) 131da177e4SLinus Torvalds #define ADFS_NDA_PUBLIC_WRITE (1 << 6) 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds #include "dir_f.h" 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds struct buffer_head; 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds /* 201da177e4SLinus Torvalds * Directory handling 211da177e4SLinus Torvalds */ 221da177e4SLinus Torvalds struct adfs_dir { 231da177e4SLinus Torvalds struct super_block *sb; 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds int nr_buffers; 261da177e4SLinus Torvalds struct buffer_head *bh[4]; 271da177e4SLinus Torvalds unsigned int pos; 281da177e4SLinus Torvalds unsigned int parent_id; 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds struct adfs_dirheader dirhead; 311da177e4SLinus Torvalds union adfs_dirtail dirtail; 321da177e4SLinus Torvalds }; 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds /* 351da177e4SLinus Torvalds * This is the overall maximum name length 361da177e4SLinus Torvalds */ 371da177e4SLinus Torvalds #define ADFS_MAX_NAME_LEN 256 381da177e4SLinus Torvalds struct object_info { 391da177e4SLinus Torvalds __u32 parent_id; /* parent object id */ 401da177e4SLinus Torvalds __u32 file_id; /* object id */ 411da177e4SLinus Torvalds __u32 loadaddr; /* load address */ 421da177e4SLinus Torvalds __u32 execaddr; /* execution address */ 431da177e4SLinus Torvalds __u32 size; /* size */ 441da177e4SLinus Torvalds __u8 attr; /* RISC OS attributes */ 451da177e4SLinus Torvalds unsigned char name_len; /* name length */ 461da177e4SLinus Torvalds char name[ADFS_MAX_NAME_LEN];/* file name */ 471da177e4SLinus Torvalds }; 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds struct adfs_dir_ops { 501da177e4SLinus Torvalds int (*read)(struct super_block *sb, unsigned int id, unsigned int sz, struct adfs_dir *dir); 511da177e4SLinus Torvalds int (*setpos)(struct adfs_dir *dir, unsigned int fpos); 521da177e4SLinus Torvalds int (*getnext)(struct adfs_dir *dir, struct object_info *obj); 531da177e4SLinus Torvalds int (*update)(struct adfs_dir *dir, struct object_info *obj); 541da177e4SLinus Torvalds int (*create)(struct adfs_dir *dir, struct object_info *obj); 551da177e4SLinus Torvalds int (*remove)(struct adfs_dir *dir, struct object_info *obj); 56ffdc9064SAl Viro int (*sync)(struct adfs_dir *dir); 571da177e4SLinus Torvalds void (*free)(struct adfs_dir *dir); 581da177e4SLinus Torvalds }; 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds struct adfs_discmap { 611da177e4SLinus Torvalds struct buffer_head *dm_bh; 621da177e4SLinus Torvalds __u32 dm_startblk; 631da177e4SLinus Torvalds unsigned int dm_startbit; 641da177e4SLinus Torvalds unsigned int dm_endbit; 651da177e4SLinus Torvalds }; 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds /* Inode stuff */ 681da177e4SLinus Torvalds struct inode *adfs_iget(struct super_block *sb, struct object_info *obj); 691da177e4SLinus Torvalds int adfs_write_inode(struct inode *inode,int unused); 701da177e4SLinus Torvalds int adfs_notify_change(struct dentry *dentry, struct iattr *attr); 711da177e4SLinus Torvalds 721da177e4SLinus Torvalds /* map.c */ 731da177e4SLinus Torvalds extern int adfs_map_lookup(struct super_block *sb, unsigned int frag_id, unsigned int offset); 741da177e4SLinus Torvalds extern unsigned int adfs_map_free(struct super_block *sb); 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds /* Misc */ 771da177e4SLinus Torvalds void __adfs_error(struct super_block *sb, const char *function, 781da177e4SLinus Torvalds const char *fmt, ...); 798e24eea7SHarvey Harrison #define adfs_error(sb, fmt...) __adfs_error(sb, __func__, fmt) 801da177e4SLinus Torvalds 811da177e4SLinus Torvalds /* super.c */ 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds /* 841da177e4SLinus Torvalds * Inodes and file operations 851da177e4SLinus Torvalds */ 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds /* dir_*.c */ 88754661f1SArjan van de Ven extern const struct inode_operations adfs_dir_inode_operations; 894b6f5d20SArjan van de Ven extern const struct file_operations adfs_dir_operations; 90e16404edSAl Viro extern const struct dentry_operations adfs_dentry_operations; 911da177e4SLinus Torvalds extern struct adfs_dir_ops adfs_f_dir_ops; 921da177e4SLinus Torvalds extern struct adfs_dir_ops adfs_fplus_dir_ops; 931da177e4SLinus Torvalds 94ffdc9064SAl Viro extern int adfs_dir_update(struct super_block *sb, struct object_info *obj, 95ffdc9064SAl Viro int wait); 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds /* file.c */ 98754661f1SArjan van de Ven extern const struct inode_operations adfs_file_inode_operations; 994b6f5d20SArjan van de Ven extern const struct file_operations adfs_file_operations; 1001da177e4SLinus Torvalds 101e0c93142SAdrian Bunk static inline __u32 signed_asl(__u32 val, signed int shift) 1021da177e4SLinus Torvalds { 1031da177e4SLinus Torvalds if (shift >= 0) 1041da177e4SLinus Torvalds val <<= shift; 1051da177e4SLinus Torvalds else 1061da177e4SLinus Torvalds val >>= -shift; 1071da177e4SLinus Torvalds return val; 1081da177e4SLinus Torvalds } 1091da177e4SLinus Torvalds 1101da177e4SLinus Torvalds /* 1111da177e4SLinus Torvalds * Calculate the address of a block in an object given the block offset 1121da177e4SLinus Torvalds * and the object identity. 1131da177e4SLinus Torvalds * 1141da177e4SLinus Torvalds * The root directory ID should always be looked up in the map [3.4] 1151da177e4SLinus Torvalds */ 116e0c93142SAdrian Bunk static inline int 1171da177e4SLinus Torvalds __adfs_block_map(struct super_block *sb, unsigned int object_id, 1181da177e4SLinus Torvalds unsigned int block) 1191da177e4SLinus Torvalds { 1201da177e4SLinus Torvalds if (object_id & 255) { 1211da177e4SLinus Torvalds unsigned int off; 1221da177e4SLinus Torvalds 1231da177e4SLinus Torvalds off = (object_id & 255) - 1; 1241da177e4SLinus Torvalds block += off << ADFS_SB(sb)->s_log2sharesize; 1251da177e4SLinus Torvalds } 1261da177e4SLinus Torvalds 1271da177e4SLinus Torvalds return adfs_map_lookup(sb, object_id >> 8, block); 1281da177e4SLinus Torvalds } 129