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

📄 conv.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
{	*pdata = buf_alloc(bufp, count);	return copy_from_user(*pdata, data, count);}static voidp9_put_wstat(struct cbuf *bufp, struct p9_wstat *wstat,	       struct p9_stat *stat, int statsz, int dotu){	p9_put_int16(bufp, statsz, &stat->size);	p9_put_int16(bufp, wstat->type, &stat->type);	p9_put_int32(bufp, wstat->dev, &stat->dev);	p9_put_int8(bufp, wstat->qid.type, &stat->qid.type);	p9_put_int32(bufp, wstat->qid.version, &stat->qid.version);	p9_put_int64(bufp, wstat->qid.path, &stat->qid.path);	p9_put_int32(bufp, wstat->mode, &stat->mode);	p9_put_int32(bufp, wstat->atime, &stat->atime);	p9_put_int32(bufp, wstat->mtime, &stat->mtime);	p9_put_int64(bufp, wstat->length, &stat->length);	p9_put_str(bufp, wstat->name, &stat->name);	p9_put_str(bufp, wstat->uid, &stat->uid);	p9_put_str(bufp, wstat->gid, &stat->gid);	p9_put_str(bufp, wstat->muid, &stat->muid);	if (dotu) {		p9_put_str(bufp, wstat->extension, &stat->extension);		p9_put_int32(bufp, wstat->n_uid, &stat->n_uid);		p9_put_int32(bufp, wstat->n_gid, &stat->n_gid);		p9_put_int32(bufp, wstat->n_muid, &stat->n_muid);	}}static struct p9_fcall *p9_create_common(struct cbuf *bufp, u32 size, u8 id){	struct p9_fcall *fc;	size += 4 + 1 + 2;	/* size[4] id[1] tag[2] */	fc = kmalloc(sizeof(struct p9_fcall) + size, GFP_KERNEL);	if (!fc)		return ERR_PTR(-ENOMEM);	fc->sdata = (char *)fc + sizeof(*fc);	buf_init(bufp, (char *)fc->sdata, size);	p9_put_int32(bufp, size, &fc->size);	p9_put_int8(bufp, id, &fc->id);	p9_put_int16(bufp, P9_NOTAG, &fc->tag);	return fc;}void p9_set_tag(struct p9_fcall *fc, u16 tag){	fc->tag = tag;	*(__le16 *) (fc->sdata + 5) = cpu_to_le16(tag);}EXPORT_SYMBOL(p9_set_tag);struct p9_fcall *p9_create_tversion(u32 msize, char *version){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	size = 4 + 2 + strlen(version);	/* msize[4] version[s] */	fc = p9_create_common(bufp, size, P9_TVERSION);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, msize, &fc->params.tversion.msize);	p9_put_str(bufp, version, &fc->params.tversion.version);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tversion);struct p9_fcall *p9_create_tauth(u32 afid, char *uname, char *aname,	u32 n_uname, int dotu){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	/* afid[4] uname[s] aname[s] */	size = 4 + 2 + 2;	if (uname)		size += strlen(uname);	if (aname)		size += strlen(aname);	if (dotu)		size += 4;	/* n_uname */	fc = p9_create_common(bufp, size, P9_TAUTH);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, afid, &fc->params.tauth.afid);	p9_put_str(bufp, uname, &fc->params.tauth.uname);	p9_put_str(bufp, aname, &fc->params.tauth.aname);	if (dotu)		p9_put_int32(bufp, n_uname, &fc->params.tauth.n_uname);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tauth);struct p9_fcall *p9_create_tattach(u32 fid, u32 afid, char *uname, char *aname,	u32 n_uname, int dotu){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	/* fid[4] afid[4] uname[s] aname[s] */	size = 4 + 4 + 2 + 2;	if (uname)		size += strlen(uname);	if (aname)		size += strlen(aname);	if (dotu)		size += 4;	/* n_uname */	fc = p9_create_common(bufp, size, P9_TATTACH);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.tattach.fid);	p9_put_int32(bufp, afid, &fc->params.tattach.afid);	p9_put_str(bufp, uname, &fc->params.tattach.uname);	p9_put_str(bufp, aname, &fc->params.tattach.aname);	if (dotu)		p9_put_int32(bufp, n_uname, &fc->params.tattach.n_uname);error:	return fc;}EXPORT_SYMBOL(p9_create_tattach);struct p9_fcall *p9_create_tflush(u16 oldtag){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	size = 2;		/* oldtag[2] */	fc = p9_create_common(bufp, size, P9_TFLUSH);	if (IS_ERR(fc))		goto error;	p9_put_int16(bufp, oldtag, &fc->params.tflush.oldtag);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tflush);struct p9_fcall *p9_create_twalk(u32 fid, u32 newfid, u16 nwname,				     char **wnames){	int i, size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	if (nwname > P9_MAXWELEM) {		P9_DPRINTK(P9_DEBUG_ERROR, "nwname > %d\n", P9_MAXWELEM);		return NULL;	}	size = 4 + 4 + 2;	/* fid[4] newfid[4] nwname[2] ... */	for (i = 0; i < nwname; i++) {		size += 2 + strlen(wnames[i]);	/* wname[s] */	}	fc = p9_create_common(bufp, size, P9_TWALK);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.twalk.fid);	p9_put_int32(bufp, newfid, &fc->params.twalk.newfid);	p9_put_int16(bufp, nwname, &fc->params.twalk.nwname);	for (i = 0; i < nwname; i++) {		p9_put_str(bufp, wnames[i], &fc->params.twalk.wnames[i]);	}	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_twalk);struct p9_fcall *p9_create_topen(u32 fid, u8 mode){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	size = 4 + 1;		/* fid[4] mode[1] */	fc = p9_create_common(bufp, size, P9_TOPEN);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.topen.fid);	p9_put_int8(bufp, mode, &fc->params.topen.mode);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_topen);struct p9_fcall *p9_create_tcreate(u32 fid, char *name, u32 perm, u8 mode,	char *extension, int dotu){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	/* fid[4] name[s] perm[4] mode[1] */	size = 4 + 2 + strlen(name) + 4 + 1;	if (dotu) {		size += 2 +			/* extension[s] */		    (extension == NULL ? 0 : strlen(extension));	}	fc = p9_create_common(bufp, size, P9_TCREATE);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.tcreate.fid);	p9_put_str(bufp, name, &fc->params.tcreate.name);	p9_put_int32(bufp, perm, &fc->params.tcreate.perm);	p9_put_int8(bufp, mode, &fc->params.tcreate.mode);	if (dotu)		p9_put_str(bufp, extension, &fc->params.tcreate.extension);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tcreate);struct p9_fcall *p9_create_tread(u32 fid, u64 offset, u32 count){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	size = 4 + 8 + 4;	/* fid[4] offset[8] count[4] */	fc = p9_create_common(bufp, size, P9_TREAD);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.tread.fid);	p9_put_int64(bufp, offset, &fc->params.tread.offset);	p9_put_int32(bufp, count, &fc->params.tread.count);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tread);struct p9_fcall *p9_create_twrite(u32 fid, u64 offset, u32 count,				      const char *data){	int size, err;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	/* fid[4] offset[8] count[4] data[count] */	size = 4 + 8 + 4 + count;	fc = p9_create_common(bufp, size, P9_TWRITE);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.twrite.fid);	p9_put_int64(bufp, offset, &fc->params.twrite.offset);	p9_put_int32(bufp, count, &fc->params.twrite.count);	err = p9_put_data(bufp, data, count, &fc->params.twrite.data);	if (err) {		kfree(fc);		fc = ERR_PTR(err);		goto error;	}	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_twrite);struct p9_fcall *p9_create_twrite_u(u32 fid, u64 offset, u32 count,				      const char __user *data){	int size, err;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	/* fid[4] offset[8] count[4] data[count] */	size = 4 + 8 + 4 + count;	fc = p9_create_common(bufp, size, P9_TWRITE);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.twrite.fid);	p9_put_int64(bufp, offset, &fc->params.twrite.offset);	p9_put_int32(bufp, count, &fc->params.twrite.count);	err = p9_put_user_data(bufp, data, count, &fc->params.twrite.data);	if (err) {		kfree(fc);		fc = ERR_PTR(err);		goto error;	}	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_twrite_u);struct p9_fcall *p9_create_tclunk(u32 fid){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	size = 4;		/* fid[4] */	fc = p9_create_common(bufp, size, P9_TCLUNK);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.tclunk.fid);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tclunk);struct p9_fcall *p9_create_tremove(u32 fid){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	size = 4;		/* fid[4] */	fc = p9_create_common(bufp, size, P9_TREMOVE);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.tremove.fid);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tremove);struct p9_fcall *p9_create_tstat(u32 fid){	int size;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	size = 4;		/* fid[4] */	fc = p9_create_common(bufp, size, P9_TSTAT);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.tstat.fid);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_tstat);struct p9_fcall *p9_create_twstat(u32 fid, struct p9_wstat *wstat,				      int dotu){	int size, statsz;	struct p9_fcall *fc;	struct cbuf buffer;	struct cbuf *bufp = &buffer;	statsz = p9_size_wstat(wstat, dotu);	size = 4 + 2 + 2 + statsz;	/* fid[4] stat[n] */	fc = p9_create_common(bufp, size, P9_TWSTAT);	if (IS_ERR(fc))		goto error;	p9_put_int32(bufp, fid, &fc->params.twstat.fid);	buf_put_int16(bufp, statsz + 2);	p9_put_wstat(bufp, wstat, &fc->params.twstat.stat, statsz, dotu);	if (buf_check_overflow(bufp)) {		kfree(fc);		fc = ERR_PTR(-ENOMEM);	}error:	return fc;}EXPORT_SYMBOL(p9_create_twstat);

⌨️ 快捷键说明

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