📄 conv.c
字号:
{ *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 + -