diff options
Diffstat (limited to 'fs/exofs/exofs.h')
| -rw-r--r-- | fs/exofs/exofs.h | 189 | 
1 files changed, 64 insertions, 125 deletions
diff --git a/fs/exofs/exofs.h b/fs/exofs/exofs.h index 2dc925fa101..fffe86fd7a4 100644 --- a/fs/exofs/exofs.h +++ b/fs/exofs/exofs.h @@ -36,12 +36,9 @@  #include <linux/fs.h>  #include <linux/time.h>  #include <linux/backing-dev.h> -#include "common.h" +#include <scsi/osd_ore.h> -/* FIXME: Remove once pnfs hits mainline - * #include <linux/exportfs/pnfs_osd_xdr.h> - */ -#include "pnfs.h" +#include "common.h"  #define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a) @@ -56,45 +53,30 @@  /* u64 has problems with printk this will cast it to unsigned long long */  #define _LLU(x) (unsigned long long)(x) -struct exofs_layout { -	osd_id		s_pid;			/* partition ID of file system*/ - -	/* Our way of looking at the data_map */ -	unsigned stripe_unit; -	unsigned mirrors_p1; - -	unsigned group_width; -	u64	 group_depth; -	unsigned group_count; - -	enum exofs_inode_layout_gen_functions lay_func; - -	unsigned	s_numdevs;		/* Num of devices in array    */ -	struct osd_dev	*s_ods[0];		/* Variable length            */ +struct exofs_dev { +	struct ore_dev ored; +	unsigned did; +	unsigned urilen; +	uint8_t *uri; +	struct kobject ed_kobj;  }; -  /*   * our extension to the in-memory superblock   */  struct exofs_sb_info { -	struct exofs_fscb s_fscb;		/* Written often, pre-allocate*/ +	struct backing_dev_info bdi;		/* register our bdi with VFS  */ +	struct exofs_sb_stats s_ess;		/* Written often, pre-allocate*/  	int		s_timeout;		/* timeout for OSD operations */  	uint64_t	s_nextid;		/* highest object ID used     */  	uint32_t	s_numfiles;		/* number of files on fs      */  	spinlock_t	s_next_gen_lock;	/* spinlock for gen # update  */  	u32		s_next_generation;	/* next gen # to use          */  	atomic_t	s_curr_pending;		/* number of pending commands */ -	uint8_t		s_cred[OSD_CAP_LEN];	/* credential for the fscb    */ -	struct 		backing_dev_info bdi;	/* register our bdi with VFS  */ - -	struct pnfs_osd_data_map data_map;	/* Default raid to use -						 * FIXME: Needed ? -						 */ -/*	struct exofs_layout	dir_layout;*/	/* Default dir layout */ -	struct exofs_layout	layout;		/* Default files layout, -						 * contains the variable osd_dev -						 * array. Keep last */ -	struct osd_dev	*_min_one_dev[1];	/* Place holder for one dev   */ + +	struct ore_layout	layout;		/* Default files layout       */ +	struct ore_comp one_comp;		/* id & cred of partition id=0*/ +	struct ore_components oc;		/* comps for the partition    */ +	struct kobject	s_kobj;			/* holds per-sbi kobject      */  };  /* @@ -107,7 +89,8 @@ struct exofs_i_info {  	uint32_t       i_data[EXOFS_IDATA];/*short symlink names and device #s*/  	uint32_t       i_dir_start_lookup; /* which page to start lookup      */  	uint64_t       i_commit_size;      /* the object's written length     */ -	uint8_t        i_cred[OSD_CAP_LEN];/* all-powerful credential         */ +	struct ore_comp one_comp;	   /* same component for all devices  */ +	struct ore_components oc;	   /* inode view of the device table  */  };  static inline osd_id exofs_oi_objno(struct exofs_i_info *oi) @@ -115,52 +98,6 @@ static inline osd_id exofs_oi_objno(struct exofs_i_info *oi)  	return oi->vfs_inode.i_ino + EXOFS_OBJ_OFF;  } -struct exofs_io_state; -typedef void (*exofs_io_done_fn)(struct exofs_io_state *or, void *private); - -struct exofs_io_state { -	struct kref		kref; - -	void			*private; -	exofs_io_done_fn	done; - -	struct exofs_layout	*layout; -	struct osd_obj_id	obj; -	u8			*cred; - -	/* Global read/write IO*/ -	loff_t			offset; -	unsigned long		length; -	void			*kern_buff; - -	struct page		**pages; -	unsigned		nr_pages; -	unsigned		pgbase; -	unsigned		pages_consumed; - -	/* Attributes */ -	unsigned		in_attr_len; -	struct osd_attr 	*in_attr; -	unsigned		out_attr_len; -	struct osd_attr 	*out_attr; - -	/* Variable array of size numdevs */ -	unsigned numdevs; -	struct exofs_per_dev_state { -		struct osd_request *or; -		struct bio *bio; -		loff_t offset; -		unsigned length; -		unsigned dev; -	} per_dev[]; -}; - -static inline unsigned exofs_io_state_size(unsigned numdevs) -{ -	return sizeof(struct exofs_io_state) + -		sizeof(struct exofs_per_dev_state) * numdevs; -} -  /*   * our inode flags   */ @@ -205,12 +142,6 @@ static inline struct exofs_i_info *exofs_i(struct inode *inode)  }  /* - * Given a layout, object_number and stripe_index return the associated global - * dev_index - */ -unsigned exofs_layout_od_id(struct exofs_layout *layout, -			    osd_id obj_no, unsigned layout_index); -/*   * Maximum count of links to a file   */  #define EXOFS_LINK_MAX           32000 @@ -219,49 +150,15 @@ unsigned exofs_layout_od_id(struct exofs_layout *layout,   * function declarations *   *************************/ -/* ios.c */ -void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], -			   const struct osd_obj_id *obj); -int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj, -		    u64 offset, void *p, unsigned length); - -int  exofs_get_io_state(struct exofs_layout *layout, -			struct exofs_io_state **ios); -void exofs_put_io_state(struct exofs_io_state *ios); - -int exofs_check_io(struct exofs_io_state *ios, u64 *resid); - -int exofs_sbi_create(struct exofs_io_state *ios); -int exofs_sbi_remove(struct exofs_io_state *ios); -int exofs_sbi_write(struct exofs_io_state *ios); -int exofs_sbi_read(struct exofs_io_state *ios); - -int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr); - -int exofs_oi_truncate(struct exofs_i_info *oi, u64 new_len); -static inline int exofs_oi_write(struct exofs_i_info *oi, -				 struct exofs_io_state *ios) -{ -	ios->obj.id = exofs_oi_objno(oi); -	ios->cred = oi->i_cred; -	return exofs_sbi_write(ios); -} - -static inline int exofs_oi_read(struct exofs_i_info *oi, -				struct exofs_io_state *ios) -{ -	ios->obj.id = exofs_oi_objno(oi); -	ios->cred = oi->i_cred; -	return exofs_sbi_read(ios); -} -  /* inode.c               */ +unsigned exofs_max_io_pages(struct ore_layout *layout, +			    unsigned expected_pages);  int exofs_setattr(struct dentry *, struct iattr *);  int exofs_write_begin(struct file *file, struct address_space *mapping,  		loff_t pos, unsigned len, unsigned flags,  		struct page **pagep, void **fsdata);  extern struct inode *exofs_iget(struct super_block *, unsigned long); -struct inode *exofs_new_inode(struct inode *, int); +struct inode *exofs_new_inode(struct inode *, umode_t);  extern int exofs_write_inode(struct inode *, struct writeback_control *wbc);  extern void exofs_evict_inode(struct inode *); @@ -279,7 +176,19 @@ int exofs_set_link(struct inode *, struct exofs_dir_entry *, struct page *,  		    struct inode *);  /* super.c               */ -int exofs_sync_fs(struct super_block *sb, int wait); +void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], +			   const struct osd_obj_id *obj); +int exofs_sbi_write_stats(struct exofs_sb_info *sbi); + +/* sys.c                 */ +int exofs_sysfs_init(void); +void exofs_sysfs_uninit(void); +int exofs_sysfs_sb_add(struct exofs_sb_info *sbi, +		       struct exofs_dt_device_info *dt_dev); +void exofs_sysfs_sb_del(struct exofs_sb_info *sbi); +int exofs_sysfs_odev_add(struct exofs_dev *edev, +			 struct exofs_sb_info *sbi); +void exofs_sysfs_dbg_print(void);  /*********************   * operation vectors * @@ -293,7 +202,6 @@ extern const struct file_operations exofs_file_operations;  /* inode.c           */  extern const struct address_space_operations exofs_aops; -extern const struct osd_attr g_attr_logical_length;  /* namei.c           */  extern const struct inode_operations exofs_dir_inode_operations; @@ -303,4 +211,35 @@ extern const struct inode_operations exofs_special_inode_operations;  extern const struct inode_operations exofs_symlink_inode_operations;  extern const struct inode_operations exofs_fast_symlink_inode_operations; +/* exofs_init_comps will initialize an ore_components device array + * pointing to a single ore_comp struct, and a round-robin view + * of the device table. + * The first device of each inode is the [inode->ino % num_devices] + * and the rest of the devices sequentially following where the + * first device is after the last device. + * It is assumed that the global device array at @sbi is twice + * bigger and that the device table repeats twice. + * See: exofs_read_lookup_dev_table() + */ +static inline void exofs_init_comps(struct ore_components *oc, +				    struct ore_comp *one_comp, +				    struct exofs_sb_info *sbi, osd_id oid) +{ +	unsigned dev_mod = (unsigned)oid, first_dev; + +	one_comp->obj.partition = sbi->one_comp.obj.partition; +	one_comp->obj.id = oid; +	exofs_make_credential(one_comp->cred, &one_comp->obj); + +	oc->first_dev = 0; +	oc->numdevs = sbi->layout.group_width * sbi->layout.mirrors_p1 * +							sbi->layout.group_count; +	oc->single_comp = EC_SINGLE_COMP; +	oc->comps = one_comp; + +	/* Round robin device view of the table */ +	first_dev = (dev_mod * sbi->layout.mirrors_p1) % sbi->oc.numdevs; +	oc->ods = &sbi->oc.ods[first_dev]; +} +  #endif  | 
