xref: /openbmc/linux/fs/adfs/adfs.h (revision ffdc9064)
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