MDC模块是处在Lustre Lite之下的一层。它定义了一些元数据相关的函数, Lustre Lite可以调用这些函数来向MDS传输元数据请求。这些函数在lustre/mdc中实现,我们将在6.3节讨论它们。
Lustre Lite在mdc_op_data数据结构中传递请求参数,所有的请求最终要转化为ptl_request结构。所以,在RPC请求执行之前,有一些准备步骤(打包)。为这个目的,在mdc_lib.c里,定义了一些函数。而这些函数中的其中一部分实际上调用了由PortalRPC层提供的打包帮助函数。
一旦ptl_request准备好,MDC就可以调用ptlrpc_queue_wait()来发送请求。这是一个同步操作。所有的包含意图的元数据操作也是同步的。也有其他一些用来进行发送操作的ptlrpc方法,它们被用来进行无意图的元数据操作(mdc_reint)——这些在源码mdc_reint.c中完成。
在大部分情况下,对由mdc_op_data到ptl_request转换的驱动,和对请求入队列的调用,都是在mdc_enqueue中进行的,这在lustre/mdc/mdc_locks.c里实现。
根据分条EA是否被创建,有三种格式:
用户格式和盘上格式的不同体现在两方面:
为了处理分条EA,定义了五类API。如下所列:
设置/获取API 用来从存储器中设置或获取分条EA。它对盘上分条EA进行操作。
intfsfilt_set_md(struct obd_device *obd, struct inode *inode,
void *handle, void*md, int size, const char *name)
intfsfilt_get_md(struct obd_device *obd, struct inode *inode,
void *md, int size,const char *name)
这里,md是分条EA的缓冲,handle是日志处理函数,而inode指向MDS对象。
打包/解包API 由于EA在磁盘中以打包的方式存储,所以它们需要在调用fsfilt_get_md()之后解包。这些API可以对盘上或者内存中的分条EA使用。
intobd_packmd(struct obd_export *exp, struct lov_mds_md **disk_tgt,
struct lov_stripe_md *mem_src)
intobd_unpackmd(struct obd_export *exp, struct lov_stripe_md **mem_tgt,
struct lov_mds_md *disk_src, int disk_len)
这里,mem_src指向分条EA的内存中结构,而disk_tgt指向分条EA的盘上结构。反过来,disk_src是盘上分条EA源,而mem_tgt是内存中的分条EA目的。
分配/释放API 分配和释放内存中和盘上的分条EA。
voidobd_size_diskmd(struct obd_export *exp, struct lov_mds_md *dis_tgt)
intobd_alloc_diskmd(struct obd_export *exp, struct lov_mds_md **disk_tgt)
intobd_free_diskmd(struct obd_export *exp, struct lov_mds_md **disk_tgt)
intobd_alloc_memmd(struct obd_export *exp, struct lov_stripe_md **mem_tgt)
intobd_free_memmd(struct obd_export *exp, struct lov_stripe_md **mem_tgt)
分条定位API 从分条EA中返回数据对象位置信息。
obd_sizelove_stripe_size(struct lov_stripe_md *lsm, obd_size ost_size, int stripeno)
intlov_stripe_offset(struct lov_stripe_md *lsm, obd_off lov_off,
int stripeno, obd_off *obd_off)
intlov_stripe_number(struct lov_stripe_md *lsm, obd_off lov_off)
这里,lov_off是文件逻辑偏移量。stripeno是数据对象的分条数量。
lfs API 用户层的用来处理分条EA的API,这由lfs工具使用。
intllapi_file_get_stripe(const char *path, struct lov_user_md *lum)
intllapi_file_open(const char *name, int flags, int mode,
unsigned long stripe_size, intstripe_offset, int stripe_count,int stripe_pattern)
这里llapi_file_get_stripe()在给定路径时,返回用户分条EA,而llapi_file_open()打开或者创建文件,该文件使用用户定义的分条模式。值得指出的是,stripe_offset和用户空间中使用的stripe_index相同,它是首个分条的OST索引。
本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article