Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | /* Internal data structures for ADFS */ #define ADFS_FREE_FRAG 0 #define ADFS_BAD_FRAG 1 #define ADFS_ROOT_FRAG 2 #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) #include "dir_f.h" /* * Directory handling */ struct adfs_dir { struct super_block *sb; int nr_buffers; struct buffer_head *bh[4]; unsigned int pos; unsigned int parent_id; struct adfs_dirheader dirhead; union adfs_dirtail dirtail; }; /* * This is the overall maximum name length */ #define ADFS_MAX_NAME_LEN 256 struct object_info { __u32 parent_id; /* parent object id */ __u32 file_id; /* object id */ __u32 loadaddr; /* load address */ __u32 execaddr; /* execution address */ __u32 size; /* size */ __u8 attr; /* RISC OS attributes */ unsigned char name_len; /* name length */ char name[ADFS_MAX_NAME_LEN];/* file name */ }; struct adfs_dir_ops { int (*read)(struct super_block *sb, unsigned int id, unsigned int sz, struct adfs_dir *dir); int (*setpos)(struct adfs_dir *dir, unsigned int fpos); int (*getnext)(struct adfs_dir *dir, struct object_info *obj); int (*update)(struct adfs_dir *dir, struct object_info *obj); int (*create)(struct adfs_dir *dir, struct object_info *obj); int (*remove)(struct adfs_dir *dir, struct object_info *obj); void (*free)(struct adfs_dir *dir); }; struct adfs_discmap { struct buffer_head *dm_bh; __u32 dm_startblk; unsigned int dm_startbit; unsigned int dm_endbit; }; /* dir stuff */ /* Inode stuff */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) int adfs_get_block(struct inode *inode, long block, struct buffer_head *bh, int create); #else int adfs_bmap(struct inode *inode, int block); #endif struct inode *adfs_iget(struct super_block *sb, struct object_info *obj); void adfs_read_inode(struct inode *inode); void adfs_write_inode(struct inode *inode); int adfs_notify_change(struct dentry *dentry, struct iattr *attr); /* map.c */ extern int adfs_map_lookup(struct super_block *sb, int frag_id, int offset); extern unsigned int adfs_map_free(struct super_block *sb); /* Misc */ void __adfs_error(struct super_block *sb, const char *function, const char *fmt, ...); #define adfs_error(sb, fmt...) __adfs_error(sb, __FUNCTION__, fmt) /* namei.c */ extern struct dentry *adfs_lookup(struct inode *dir, struct dentry *dentry); /* super.c */ /* * Inodes and file operations */ /* dir_*.c */ extern struct inode_operations adfs_dir_inode_operations; extern struct file_operations adfs_dir_operations; extern struct adfs_dir_ops adfs_f_dir_ops; extern struct adfs_dir_ops adfs_fplus_dir_ops; extern int adfs_dir_update(struct super_block *sb, struct object_info *obj); /* file.c */ extern struct inode_operations adfs_file_inode_operations; extern struct file_operations adfs_file_operations; extern inline __u32 signed_asl(__u32 val, signed int shift) { if (shift >= 0) val <<= shift; else val >>= -shift; return val; } /* * Calculate the address of a block in an object given the block offset * and the object identity. * * The root directory ID should always be looked up in the map [3.4] */ extern inline int __adfs_block_map(struct super_block *sb, unsigned int object_id, unsigned int block) { if (object_id & 255) { unsigned int off; off = (object_id & 255) - 1; block += off << sb->u.adfs_sb.s_log2sharesize; } return adfs_map_lookup(sb, object_id >> 8, block); } |