⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsclient.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	return 0;}/* * FS.CreateFile and FS.MakeDir operation type */static const struct afs_call_type afs_RXFSCreateXXXX = {	.name		= "FS.CreateXXXX",	.deliver	= afs_deliver_fs_create_vnode,	.abort_to_error	= afs_abort_to_error,	.destructor	= afs_flat_call_destructor,};/* * create a file or make a directory */int afs_fs_create(struct afs_server *server,		  struct key *key,		  struct afs_vnode *vnode,		  const char *name,		  umode_t mode,		  struct afs_fid *newfid,		  struct afs_file_status *newstatus,		  struct afs_callback *newcb,		  const struct afs_wait_mode *wait_mode){	struct afs_call *call;	size_t namesz, reqsz, padsz;	__be32 *bp;	_enter("");	namesz = strlen(name);	padsz = (4 - (namesz & 3)) & 3;	reqsz = (5 * 4) + namesz + padsz + (6 * 4);	call = afs_alloc_flat_call(&afs_RXFSCreateXXXX, reqsz,				   (3 + 21 + 21 + 3 + 6) * 4);	if (!call)		return -ENOMEM;	call->key = key;	call->reply = vnode;	call->reply2 = newfid;	call->reply3 = newstatus;	call->reply4 = newcb;	call->service_id = FS_SERVICE;	call->port = htons(AFS_FS_PORT);	/* marshall the parameters */	bp = call->request;	*bp++ = htonl(S_ISDIR(mode) ? FSMAKEDIR : FSCREATEFILE);	*bp++ = htonl(vnode->fid.vid);	*bp++ = htonl(vnode->fid.vnode);	*bp++ = htonl(vnode->fid.unique);	*bp++ = htonl(namesz);	memcpy(bp, name, namesz);	bp = (void *) bp + namesz;	if (padsz > 0) {		memset(bp, 0, padsz);		bp = (void *) bp + padsz;	}	*bp++ = htonl(AFS_SET_MODE);	*bp++ = 0; /* mtime */	*bp++ = 0; /* owner */	*bp++ = 0; /* group */	*bp++ = htonl(mode & S_IALLUGO); /* unix mode */	*bp++ = 0; /* segment size */	return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);}/* * deliver reply data to an FS.RemoveFile or FS.RemoveDir */static int afs_deliver_fs_remove(struct afs_call *call,				 struct sk_buff *skb, bool last){	struct afs_vnode *vnode = call->reply;	const __be32 *bp;	_enter("{%u},{%u},%d", call->unmarshall, skb->len, last);	afs_transfer_reply(call, skb);	if (!last)		return 0;	if (call->reply_size != call->reply_max)		return -EBADMSG;	/* unmarshall the reply once we've received all of it */	bp = call->buffer;	xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);	/* xdr_decode_AFSVolSync(&bp, call->replyX); */	_leave(" = 0 [done]");	return 0;}/* * FS.RemoveDir/FS.RemoveFile operation type */static const struct afs_call_type afs_RXFSRemoveXXXX = {	.name		= "FS.RemoveXXXX",	.deliver	= afs_deliver_fs_remove,	.abort_to_error	= afs_abort_to_error,	.destructor	= afs_flat_call_destructor,};/* * remove a file or directory */int afs_fs_remove(struct afs_server *server,		  struct key *key,		  struct afs_vnode *vnode,		  const char *name,		  bool isdir,		  const struct afs_wait_mode *wait_mode){	struct afs_call *call;	size_t namesz, reqsz, padsz;	__be32 *bp;	_enter("");	namesz = strlen(name);	padsz = (4 - (namesz & 3)) & 3;	reqsz = (5 * 4) + namesz + padsz;	call = afs_alloc_flat_call(&afs_RXFSRemoveXXXX, reqsz, (21 + 6) * 4);	if (!call)		return -ENOMEM;	call->key = key;	call->reply = vnode;	call->service_id = FS_SERVICE;	call->port = htons(AFS_FS_PORT);	/* marshall the parameters */	bp = call->request;	*bp++ = htonl(isdir ? FSREMOVEDIR : FSREMOVEFILE);	*bp++ = htonl(vnode->fid.vid);	*bp++ = htonl(vnode->fid.vnode);	*bp++ = htonl(vnode->fid.unique);	*bp++ = htonl(namesz);	memcpy(bp, name, namesz);	bp = (void *) bp + namesz;	if (padsz > 0) {		memset(bp, 0, padsz);		bp = (void *) bp + padsz;	}	return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);}/* * deliver reply data to an FS.Link */static int afs_deliver_fs_link(struct afs_call *call,			       struct sk_buff *skb, bool last){	struct afs_vnode *dvnode = call->reply, *vnode = call->reply2;	const __be32 *bp;	_enter("{%u},{%u},%d", call->unmarshall, skb->len, last);	afs_transfer_reply(call, skb);	if (!last)		return 0;	if (call->reply_size != call->reply_max)		return -EBADMSG;	/* unmarshall the reply once we've received all of it */	bp = call->buffer;	xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);	xdr_decode_AFSFetchStatus(&bp, &dvnode->status, dvnode, NULL);	/* xdr_decode_AFSVolSync(&bp, call->replyX); */	_leave(" = 0 [done]");	return 0;}/* * FS.Link operation type */static const struct afs_call_type afs_RXFSLink = {	.name		= "FS.Link",	.deliver	= afs_deliver_fs_link,	.abort_to_error	= afs_abort_to_error,	.destructor	= afs_flat_call_destructor,};/* * make a hard link */int afs_fs_link(struct afs_server *server,		struct key *key,		struct afs_vnode *dvnode,		struct afs_vnode *vnode,		const char *name,		const struct afs_wait_mode *wait_mode){	struct afs_call *call;	size_t namesz, reqsz, padsz;	__be32 *bp;	_enter("");	namesz = strlen(name);	padsz = (4 - (namesz & 3)) & 3;	reqsz = (5 * 4) + namesz + padsz + (3 * 4);	call = afs_alloc_flat_call(&afs_RXFSLink, reqsz, (21 + 21 + 6) * 4);	if (!call)		return -ENOMEM;	call->key = key;	call->reply = dvnode;	call->reply2 = vnode;	call->service_id = FS_SERVICE;	call->port = htons(AFS_FS_PORT);	/* marshall the parameters */	bp = call->request;	*bp++ = htonl(FSLINK);	*bp++ = htonl(dvnode->fid.vid);	*bp++ = htonl(dvnode->fid.vnode);	*bp++ = htonl(dvnode->fid.unique);	*bp++ = htonl(namesz);	memcpy(bp, name, namesz);	bp = (void *) bp + namesz;	if (padsz > 0) {		memset(bp, 0, padsz);		bp = (void *) bp + padsz;	}	*bp++ = htonl(vnode->fid.vid);	*bp++ = htonl(vnode->fid.vnode);	*bp++ = htonl(vnode->fid.unique);	return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);}/* * deliver reply data to an FS.Symlink */static int afs_deliver_fs_symlink(struct afs_call *call,				  struct sk_buff *skb, bool last){	struct afs_vnode *vnode = call->reply;	const __be32 *bp;	_enter("{%u},{%u},%d", call->unmarshall, skb->len, last);	afs_transfer_reply(call, skb);	if (!last)		return 0;	if (call->reply_size != call->reply_max)		return -EBADMSG;	/* unmarshall the reply once we've received all of it */	bp = call->buffer;	xdr_decode_AFSFid(&bp, call->reply2);	xdr_decode_AFSFetchStatus(&bp, call->reply3, NULL, NULL);	xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);	/* xdr_decode_AFSVolSync(&bp, call->replyX); */	_leave(" = 0 [done]");	return 0;}/* * FS.Symlink operation type */static const struct afs_call_type afs_RXFSSymlink = {	.name		= "FS.Symlink",	.deliver	= afs_deliver_fs_symlink,	.abort_to_error	= afs_abort_to_error,	.destructor	= afs_flat_call_destructor,};/* * create a symbolic link */int afs_fs_symlink(struct afs_server *server,		   struct key *key,		   struct afs_vnode *vnode,		   const char *name,		   const char *contents,		   struct afs_fid *newfid,		   struct afs_file_status *newstatus,		   const struct afs_wait_mode *wait_mode){	struct afs_call *call;	size_t namesz, reqsz, padsz, c_namesz, c_padsz;	__be32 *bp;	_enter("");	namesz = strlen(name);	padsz = (4 - (namesz & 3)) & 3;	c_namesz = strlen(contents);	c_padsz = (4 - (c_namesz & 3)) & 3;	reqsz = (6 * 4) + namesz + padsz + c_namesz + c_padsz + (6 * 4);	call = afs_alloc_flat_call(&afs_RXFSSymlink, reqsz,				   (3 + 21 + 21 + 6) * 4);	if (!call)		return -ENOMEM;	call->key = key;	call->reply = vnode;	call->reply2 = newfid;	call->reply3 = newstatus;	call->service_id = FS_SERVICE;	call->port = htons(AFS_FS_PORT);	/* marshall the parameters */	bp = call->request;	*bp++ = htonl(FSSYMLINK);	*bp++ = htonl(vnode->fid.vid);	*bp++ = htonl(vnode->fid.vnode);	*bp++ = htonl(vnode->fid.unique);	*bp++ = htonl(namesz);	memcpy(bp, name, namesz);	bp = (void *) bp + namesz;	if (padsz > 0) {		memset(bp, 0, padsz);		bp = (void *) bp + padsz;	}	*bp++ = htonl(c_namesz);	memcpy(bp, contents, c_namesz);	bp = (void *) bp + c_namesz;	if (c_padsz > 0) {		memset(bp, 0, c_padsz);		bp = (void *) bp + c_padsz;	}	*bp++ = htonl(AFS_SET_MODE);	*bp++ = 0; /* mtime */	*bp++ = 0; /* owner */	*bp++ = 0; /* group */	*bp++ = htonl(S_IRWXUGO); /* unix mode */	*bp++ = 0; /* segment size */	return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);}/* * deliver reply data to an FS.Rename */static int afs_deliver_fs_rename(struct afs_call *call,				  struct sk_buff *skb, bool last){	struct afs_vnode *orig_dvnode = call->reply, *new_dvnode = call->reply2;	const __be32 *bp;	_enter("{%u},{%u},%d", call->unmarshall, skb->len, last);	afs_transfer_reply(call, skb);	if (!last)		return 0;	if (call->reply_size != call->reply_max)		return -EBADMSG;	/* unmarshall the reply once we've received all of it */	bp = call->buffer;	xdr_decode_AFSFetchStatus(&bp, &orig_dvnode->status, orig_dvnode, NULL);	if (new_dvnode != orig_dvnode)		xdr_decode_AFSFetchStatus(&bp, &new_dvnode->status, new_dvnode,					  NULL);	/* xdr_decode_AFSVolSync(&bp, call->replyX); */	_leave(" = 0 [done]");	return 0;}/* * FS.Rename operation type */static const struct afs_call_type afs_RXFSRename = {	.name		= "FS.Rename",	.deliver	= afs_deliver_fs_rename,	.abort_to_error	= afs_abort_to_error,	.destructor	= afs_flat_call_destructor,};/* * create a symbolic link */int afs_fs_rename(struct afs_server *server,		  struct key *key,		  struct afs_vnode *orig_dvnode,		  const char *orig_name,		  struct afs_vnode *new_dvnode,		  const char *new_name,		  const struct afs_wait_mode *wait_mode){	struct afs_call *call;	size_t reqsz, o_namesz, o_padsz, n_namesz, n_padsz;	__be32 *bp;	_enter("");	o_namesz = strlen(orig_name);	o_padsz = (4 - (o_namesz & 3)) & 3;	n_namesz = strlen(new_name);	n_padsz = (4 - (n_namesz & 3)) & 3;	reqsz = (4 * 4) +		4 + o_namesz + o_padsz +		(3 * 4) +		4 + n_namesz + n_padsz;	call = afs_alloc_flat_call(&afs_RXFSRename, reqsz, (21 + 21 + 6) * 4);	if (!call)		return -ENOMEM;	call->key = key;	call->reply = orig_dvnode;	call->reply2 = new_dvnode;	call->service_id = FS_SERVICE;	call->port = htons(AFS_FS_PORT);	/* marshall the parameters */	bp = call->request;	*bp++ = htonl(FSRENAME);	*bp++ = htonl(orig_dvnode->fid.vid);	*bp++ = htonl(orig_dvnode->fid.vnode);	*bp++ = htonl(orig_dvnode->fid.unique);	*bp++ = htonl(o_namesz);	memcpy(bp, orig_name, o_namesz);	bp = (void *) bp + o_namesz;	if (o_padsz > 0) {		memset(bp, 0, o_padsz);		bp = (void *) bp + o_padsz;	}	*bp++ = htonl(new_dvnode->fid.vid);	*bp++ = htonl(new_dvnode->fid.vnode);	*bp++ = htonl(new_dvnode->fid.unique);	*bp++ = htonl(n_namesz);	memcpy(bp, new_name, n_namesz);	bp = (void *) bp + n_namesz;	if (n_padsz > 0) {		memset(bp, 0, n_padsz);		bp = (void *) bp + n_padsz;	}	return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);}/* * deliver reply data to an FS.StoreData */static int afs_deliver_fs_store_data(struct afs_call *call,				     struct sk_buff *skb, bool last){	struct afs_vnode *vnode = call->reply;	const __be32 *bp;	_enter(",,%u", last);	afs_transfer_reply(call, skb);	if (!last) {		_leave(" = 0 [more]");		return 0;	}	if (call->reply_size != call->reply_max) {		_leave(" = -EBADMSG [%u != %u]",		       call->reply_size, call->reply_max);		return -EBADMSG;	}	/* unmarshall the reply once we've received all of it */	bp = call->buffer;	xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode,				  &call->store_version);	/* xdr_decode_AFSVolSync(&bp, call->replyX); */	afs_pages_written_back(vnode, call);	_leave(" = 0 [done]");	return 0;}/* * FS.StoreData operation type */static const struct afs_call_type afs_RXFSStoreData = {	.name		= "FS.StoreData",	.deliver	= afs_deliver_fs_store_data,	.abort_to_error	= afs_abort_to_error,	.destructor	= afs_flat_call_destructor,};static const struct afs_call_type afs_RXFSStoreData64 = {	.name		= "FS.StoreData64",	.deliver	= afs_deliver_fs_store_data,	.abort_to_error	= afs_abort_to_error,	.destructor	= afs_flat_call_destructor,};/* * store a set of pages to a very large file */static int afs_fs_store_data64(struct afs_server *server,			       struct afs_writeback *wb,			       pgoff_t first, pgoff_t last,			       unsigned offset, unsigned to,			       loff_t size, loff_t pos, loff_t i_size,			       const struct afs_wait_mode *wait_mode){	struct afs_vnode *vnode = wb->vnode;	struct afs_call *call;	__be32 *bp;	_enter(",%x,{%x:%u},,",	       key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode);	call = afs_alloc_flat_call(&afs_RXFSStoreData64,				   (4 + 6 + 3 * 2) * 4,				   (21 + 6) * 4);	if (!call)		return -ENOMEM;	call->wb = wb;	call->key = wb->key;	call->reply = vnode;	call->service_id = FS_SERVICE;	call->port = htons(AFS_FS_PORT);	call->mapping = vnode->vfs_inode.i_mapping;	call->first = first;	call->last = last;	call->first_offset = offset;	call->last_to = to;	call->send_pages = true;	call->store_version = vnode->status.data_version + 1;	/* marshall the parameters */	bp = call->request;	*bp++ = htonl(FSSTOREDATA64);	*bp++ = htonl(vnode->fid.vid);	*bp++ = htonl(vnode->fid.vnode);	*bp++ = htonl(vnode->fid.unique);	*bp++ = 0; /* mask */	*bp++ = 0; /* mtime */	*bp++ = 0; /* owner */	*bp++ = 0; /* group */	*bp++ = 0; /* unix mode */	*bp++ = 0; /* segment size */	*bp++ = htonl(pos >> 32);	*bp++ = htonl((u32) pos);	*bp++ = htonl(size >> 32);	*bp++ = htonl((u32) size);	*bp++ = htonl(i_size >> 32);	*bp++ = htonl((u32) i_size);	return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);}/* * store a set of pages */int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb,		      pgoff_t first, pgoff_t last,		      unsigned offset, unsigned to,		      const struct afs_wait_mode *wait_mode){	struct afs_vnode *vnode = wb->vnode;	struct afs_call *call;	loff_t size, pos, i_size;	__be32 *bp;	_enter(",%x,{%x:%u},,",	       key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode);	size = to - offset;	if (first != last)		size += (loff_t)(last - first) << PAGE_SHIFT;	pos = (loff_t)first << PAGE_SHIFT;	pos += offset;	i_size = i_size_read(&vnode->vfs_inode);	if (pos + size > i_size)		i_size = size + pos;	_debug("size %llx, at %llx, i_size %llx",	       (unsigned long long) size, (unsigned long long) pos,	       (unsigned long long) i_size);	if (pos >> 32 || i_size >> 32 || size >> 32 || (pos + size) >> 32)		return afs_fs_store_data64(server, wb, first, last, offset, to,					   size, pos, i_size, wait_mode);	call = afs_alloc_flat_call(&afs_RXFSStoreData,				   (4 + 6 + 3) * 4,				   (21 + 6) * 4);	if (!call)		return -ENOMEM;	call->wb = wb;	call->key = wb->key;	call->reply = vnode;	call->service_id = FS_SERVICE;	call->port = htons(AFS_FS_PORT);	call->mapping = vnode->vfs_inode.i_mapping;	call->first = first;	call->last = last;	call->first_offset = offset;	call->last_to = to;	call->send_pages = true;	call->store_version = vnode->status.data_version + 1;	/* marshall the parameters */	bp = call->request;	*bp++ = htonl(FSSTOREDATA);	*bp++ = htonl(vnode->fid.vid);	*bp++ = htonl(vnode->fid.vnode);	*bp++ = htonl(vnode->fid.unique);	*bp++ = 0; /* mask */	*bp++ = 0; /* mtime */	*bp++ = 0; /* owner */	*bp++ = 0; /* group */	*bp++ = 0; /* unix mode */	*bp++ = 0; /* segment size */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -