NFS文件系统中WRITE操作比READ操作要复杂一些。READ操作中只需要将数据从服务器中读取到客户端的缓存页中就可以了,但是WRITE操作中客户端可能将数据写入到服务器的缓存页中,也可能写入到服务器的磁盘中。如果数据写入到服务器的缓存页中了,客户端还需要在适当的时候发起COMMIT请求将数据写入到服务器的磁盘中。
1.WRITE请求的结构
RFC1818规定了WRITE请求报文和应答报文的格式,请求报文格式如下:
struct WRITE3args {
nfs_fh3 file; // 这是目标文件的文件句柄
offset3 offset; // 数据在文件中的偏移值
count3 count; // WRITE请求中数据长度
stable_how stable; // 数据同步方式
opaque data<>; // WRITE请求中的数据
};
应答报文格式如下:
struct WRITE3resok {
wcc_data file_wcc; // 文件的属性
count3 count; // 写入到服务器的数据量
stable_how committed; // 数据在服务器端的同步方式
writeverf3 verf; // 这是一个验证信息
};
stable_how是数据同步方式,表示数据写入到服务器的缓存页中还是磁盘中,包含三个取值:
enum stable_how {
UNSTABLE = 0, // 不强求将数据和元数据写入磁盘中
DATA_SYNC = 1, // 数据必须写入磁盘中,元数据尽量写入磁盘中
FILE_SYNC = 2 // 数据和元数据必须写入磁盘中
};
请求报文中的stable_how表示客户端的请求方式,而应答报文中的stable_how表示服务器实际操作方式,对应关系如下: