exofs: Move all operations to an io_engine
In anticipation for multi-device operations, we separate osd operations into an abstract I/O API. Currently only one device is used but later when adding more devices, we will drive all devices in parallel according to a "data_map" that describes how data is arranged on multiple devices. The file system level operates, like before, as if there is one object (inode-number) and an i_size. The io engine will split this to the same object-number but on multiple device. At first we introduce Mirror (raid 1) layout. But at the final outcome we intend to fully implement the pNFS-Objects data-map, including raid 0,4,5,6 over mirrored devices, over multiple device-groups. And more. See: http://tools.ietf.org/html/draft-ietf-nfsv4-pnfs-obj-12 * Define an io_state based API for accessing osd storage devices in an abstract way. Usage: First a caller allocates an io state with: exofs_get_io_state(struct exofs_sb_info *sbi, struct exofs_io_state** ios); Then calles one of: exofs_sbi_create(struct exofs_io_state *ios); exofs_sbi_remove(struct exofs_io_state *ios); exofs_sbi_write(struct exofs_io_state *ios); exofs_sbi_read(struct exofs_io_state *ios); exofs_oi_truncate(struct exofs_i_info *oi, u64 new_len); And when done exofs_put_io_state(struct exofs_io_state *ios); * Convert all source files to use this new API * Convert from bio_alloc to bio_kmalloc * In io engine we make use of the now fixed osd_req_decode_sense There are no functional changes or on disk additions after this patch. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
This commit is contained in:
@@ -30,14 +30,13 @@
|
||||
* along with exofs; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#ifndef __EXOFS_H__
|
||||
#define __EXOFS_H__
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/time.h>
|
||||
#include "common.h"
|
||||
|
||||
#ifndef __EXOFS_H__
|
||||
#define __EXOFS_H__
|
||||
|
||||
#define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a)
|
||||
|
||||
#ifdef CONFIG_EXOFS_DEBUG
|
||||
@@ -56,6 +55,7 @@
|
||||
*/
|
||||
struct exofs_sb_info {
|
||||
struct osd_dev *s_dev; /* returned by get_osd_dev */
|
||||
struct exofs_fscb s_fscb; /* Written often, pre-allocate*/
|
||||
osd_id s_pid; /* partition ID of file system*/
|
||||
int s_timeout; /* timeout for OSD operations */
|
||||
uint64_t s_nextid; /* highest object ID used */
|
||||
@@ -79,6 +79,50 @@ struct exofs_i_info {
|
||||
struct inode vfs_inode; /* normal in-memory inode */
|
||||
};
|
||||
|
||||
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_sb_info *sbi;
|
||||
struct osd_obj_id obj;
|
||||
u8 *cred;
|
||||
|
||||
/* Global read/write IO*/
|
||||
loff_t offset;
|
||||
unsigned long length;
|
||||
void *kern_buff;
|
||||
struct bio *bio;
|
||||
|
||||
/* 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;
|
||||
} 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
|
||||
*/
|
||||
@@ -130,6 +174,42 @@ static inline struct exofs_i_info *exofs_i(struct inode *inode)
|
||||
/*************************
|
||||
* 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_sb_info *sbi, 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 */
|
||||
void exofs_truncate(struct inode *inode);
|
||||
int exofs_setattr(struct dentry *, struct iattr *);
|
||||
@@ -169,6 +249,7 @@ 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;
|
||||
|
Reference in New Issue
Block a user