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

📄 vnode.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	_enter("%s{%x:%u.%u},%x,%s",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key),	       name);	/* this op will fetch the status on the directory we're removing from */	spin_lock(&vnode->lock);	vnode->update_cnt++;	spin_unlock(&vnode->lock);	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_remove(server, key, vnode, name, isdir,				    &afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0) {		afs_vnode_finalise_status_update(vnode, server);		afs_put_server(server);	} else {		afs_vnode_status_update_failed(vnode, ret);	}	_leave(" = %d [cnt %d]", ret, vnode->update_cnt);	return ret;no_server:	spin_lock(&vnode->lock);	vnode->update_cnt--;	ASSERTCMP(vnode->update_cnt, >=, 0);	spin_unlock(&vnode->lock);	_leave(" = %ld [cnt %d]", PTR_ERR(server), vnode->update_cnt);	return PTR_ERR(server);}/* * create a hard link */int afs_vnode_link(struct afs_vnode *dvnode, struct afs_vnode *vnode,			  struct key *key, const char *name){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%s{%x:%u.%u},%x,%s",	       dvnode->volume->vlocation->vldb.name,	       dvnode->fid.vid,	       dvnode->fid.vnode,	       dvnode->fid.unique,	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key),	       name);	/* this op will fetch the status on the directory we're removing from */	spin_lock(&vnode->lock);	vnode->update_cnt++;	spin_unlock(&vnode->lock);	spin_lock(&dvnode->lock);	dvnode->update_cnt++;	spin_unlock(&dvnode->lock);	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(dvnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_link(server, key, dvnode, vnode, name,				  &afs_sync_call);	} while (!afs_volume_release_fileserver(dvnode, server, ret));	/* adjust the flags */	if (ret == 0) {		afs_vnode_finalise_status_update(vnode, server);		afs_vnode_finalise_status_update(dvnode, server);		afs_put_server(server);	} else {		afs_vnode_status_update_failed(vnode, ret);		afs_vnode_status_update_failed(dvnode, ret);	}	_leave(" = %d [cnt %d]", ret, vnode->update_cnt);	return ret;no_server:	spin_lock(&vnode->lock);	vnode->update_cnt--;	ASSERTCMP(vnode->update_cnt, >=, 0);	spin_unlock(&vnode->lock);	spin_lock(&dvnode->lock);	dvnode->update_cnt--;	ASSERTCMP(dvnode->update_cnt, >=, 0);	spin_unlock(&dvnode->lock);	_leave(" = %ld [cnt %d]", PTR_ERR(server), vnode->update_cnt);	return PTR_ERR(server);}/* * create a symbolic link */int afs_vnode_symlink(struct afs_vnode *vnode, struct key *key,		      const char *name, const char *content,		      struct afs_fid *newfid,		      struct afs_file_status *newstatus,		      struct afs_server **_server){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%x,%s,%s,,,",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key),	       name, content);	/* this op will fetch the status on the directory we're creating in */	spin_lock(&vnode->lock);	vnode->update_cnt++;	spin_unlock(&vnode->lock);	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_symlink(server, key, vnode, name, content,				     newfid, newstatus, &afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0) {		afs_vnode_finalise_status_update(vnode, server);		*_server = server;	} else {		afs_vnode_status_update_failed(vnode, ret);		*_server = NULL;	}	_leave(" = %d [cnt %d]", ret, vnode->update_cnt);	return ret;no_server:	spin_lock(&vnode->lock);	vnode->update_cnt--;	ASSERTCMP(vnode->update_cnt, >=, 0);	spin_unlock(&vnode->lock);	_leave(" = %ld [cnt %d]", PTR_ERR(server), vnode->update_cnt);	return PTR_ERR(server);}/* * rename a file */int afs_vnode_rename(struct afs_vnode *orig_dvnode,		     struct afs_vnode *new_dvnode,		     struct key *key,		     const char *orig_name,		     const char *new_name){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%s{%u,%u,%u},%x,%s,%s",	       orig_dvnode->volume->vlocation->vldb.name,	       orig_dvnode->fid.vid,	       orig_dvnode->fid.vnode,	       orig_dvnode->fid.unique,	       new_dvnode->volume->vlocation->vldb.name,	       new_dvnode->fid.vid,	       new_dvnode->fid.vnode,	       new_dvnode->fid.unique,	       key_serial(key),	       orig_name,	       new_name);	/* this op will fetch the status on both the directories we're dealing	 * with */	spin_lock(&orig_dvnode->lock);	orig_dvnode->update_cnt++;	spin_unlock(&orig_dvnode->lock);	if (new_dvnode != orig_dvnode) {		spin_lock(&new_dvnode->lock);		new_dvnode->update_cnt++;		spin_unlock(&new_dvnode->lock);	}	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(orig_dvnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_rename(server, key, orig_dvnode, orig_name,				    new_dvnode, new_name, &afs_sync_call);	} while (!afs_volume_release_fileserver(orig_dvnode, server, ret));	/* adjust the flags */	if (ret == 0) {		afs_vnode_finalise_status_update(orig_dvnode, server);		if (new_dvnode != orig_dvnode)			afs_vnode_finalise_status_update(new_dvnode, server);		afs_put_server(server);	} else {		afs_vnode_status_update_failed(orig_dvnode, ret);		if (new_dvnode != orig_dvnode)			afs_vnode_status_update_failed(new_dvnode, ret);	}	_leave(" = %d [cnt %d]", ret, orig_dvnode->update_cnt);	return ret;no_server:	spin_lock(&orig_dvnode->lock);	orig_dvnode->update_cnt--;	ASSERTCMP(orig_dvnode->update_cnt, >=, 0);	spin_unlock(&orig_dvnode->lock);	if (new_dvnode != orig_dvnode) {		spin_lock(&new_dvnode->lock);		new_dvnode->update_cnt--;		ASSERTCMP(new_dvnode->update_cnt, >=, 0);		spin_unlock(&new_dvnode->lock);	}	_leave(" = %ld [cnt %d]", PTR_ERR(server), orig_dvnode->update_cnt);	return PTR_ERR(server);}/* * write to a file */int afs_vnode_store_data(struct afs_writeback *wb, pgoff_t first, pgoff_t last,			 unsigned offset, unsigned to){	struct afs_server *server;	struct afs_vnode *vnode = wb->vnode;	int ret;	_enter("%s{%x:%u.%u},%x,%lx,%lx,%x,%x",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(wb->key),	       first, last, offset, to);	/* this op will fetch the status */	spin_lock(&vnode->lock);	vnode->update_cnt++;	spin_unlock(&vnode->lock);	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_store_data(server, wb, first, last, offset, to,					&afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0) {		afs_vnode_finalise_status_update(vnode, server);		afs_put_server(server);	} else {		afs_vnode_status_update_failed(vnode, ret);	}	_leave(" = %d", ret);	return ret;no_server:	spin_lock(&vnode->lock);	vnode->update_cnt--;	ASSERTCMP(vnode->update_cnt, >=, 0);	spin_unlock(&vnode->lock);	return PTR_ERR(server);}/* * set the attributes on a file */int afs_vnode_setattr(struct afs_vnode *vnode, struct key *key,		      struct iattr *attr){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%x",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key));	/* this op will fetch the status */	spin_lock(&vnode->lock);	vnode->update_cnt++;	spin_unlock(&vnode->lock);	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_setattr(server, key, vnode, attr, &afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0) {		afs_vnode_finalise_status_update(vnode, server);		afs_put_server(server);	} else {		afs_vnode_status_update_failed(vnode, ret);	}	_leave(" = %d", ret);	return ret;no_server:	spin_lock(&vnode->lock);	vnode->update_cnt--;	ASSERTCMP(vnode->update_cnt, >=, 0);	spin_unlock(&vnode->lock);	return PTR_ERR(server);}/* * get the status of a volume */int afs_vnode_get_volume_status(struct afs_vnode *vnode, struct key *key,				struct afs_volume_status *vs){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%x,",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key));	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_get_volume_status(server, key, vnode, vs, &afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0)		afs_put_server(server);	_leave(" = %d", ret);	return ret;no_server:	return PTR_ERR(server);}/* * get a lock on a file */int afs_vnode_set_lock(struct afs_vnode *vnode, struct key *key,		       afs_lock_type_t type){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%x,%u",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key), type);	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_set_lock(server, key, vnode, type, &afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0)		afs_put_server(server);	_leave(" = %d", ret);	return ret;no_server:	return PTR_ERR(server);}/* * extend a lock on a file */int afs_vnode_extend_lock(struct afs_vnode *vnode, struct key *key){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%x",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key));	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_extend_lock(server, key, vnode, &afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0)		afs_put_server(server);	_leave(" = %d", ret);	return ret;no_server:	return PTR_ERR(server);}/* * release a lock on a file */int afs_vnode_release_lock(struct afs_vnode *vnode, struct key *key){	struct afs_server *server;	int ret;	_enter("%s{%x:%u.%u},%x",	       vnode->volume->vlocation->vldb.name,	       vnode->fid.vid,	       vnode->fid.vnode,	       vnode->fid.unique,	       key_serial(key));	do {		/* pick a server to query */		server = afs_volume_pick_fileserver(vnode);		if (IS_ERR(server))			goto no_server;		_debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));		ret = afs_fs_release_lock(server, key, vnode, &afs_sync_call);	} while (!afs_volume_release_fileserver(vnode, server, ret));	/* adjust the flags */	if (ret == 0)		afs_put_server(server);	_leave(" = %d", ret);	return ret;no_server:	return PTR_ERR(server);}

⌨️ 快捷键说明

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