Misc set of fixes for 9p in 6.5
Most of these clean up warnings we've gotten out of compilation tools, but several of them were from inspection while hunting down a couple of regressions. The most important one to pull is75b396821c
(fs/9p: remove unnecessary and overrestrictive check) which caused a regression for some folks by restricting mmap in any case where writeback caches weren't enabled. Most of the other bugs caught via inspection were type mismatches. Signed-off-by: Eric Van Hensbergen <ericvh@kernel.org> -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEElpbw0ZalkJikytFRiP/V+0pf/5gFAmTDH8cACgkQiP/V+0pf /5hSJQ//b59cDliC7Knf9B2Of1UsLJ2wYIbxWVYKLwYarKFn3tmtO5dPtWZrQzjB Kz6fif5z1c0WdjNFLifs/XNqUq5znX/TY8bV/NmOg8VlaoJqmUQSSYnNQOWZCFKT zwxC6BO6gPNNIkJN2xQ8oOq11Qon/nbZbuN9P2VDcT5Yr2KmFx6FHRcrBNRYAm3E UzFdjkLrLef3VrvegJNGM3Wv2HqyNBA6QhifZBjDkydtDPMd9fRNns7Q60AARR9K aqXV6SihE/Ox7sSmVNjTzYF67eq5Xjt+sSzo2SdfOaZxVIa6wf0UXQuFqmHts6Zs QUCdXS5YbQAwQfdkm22rnTIxAwsbEpFOGGweUvMBXzZbl/sq/PK4Nt6DpCS8ZFi3 81Z5Ey+Q4yaxwdirP521M4ao2Ae2Fzg12bqDTNssZdOYGcXBqBfWiR5IfMbbkgWq WzCVI3V/LshQ75pXQyS4BtW/29C2nN7g3jLrF3Q5OTe7XmHMCZFvtP4lKvY0piQy ++XoDs1LCJWSZebfkNa05L5nhQ1mYhwiZutHTtF3ejTTiJvcJXQ4xHYLzjOON+4i blLTpgWLO0rIRAmX0I8GwPi6q0xL4rFP4XGGz/LDppRQkRa13vtzFtMvuldPyEq7 g4pcLkI3SPbL982qYbg8UO+GjO/Q9M/DafXQVlUyDw04TQbT8Jg= =TAC1 -----END PGP SIGNATURE----- Merge tag '9p-fixes-6.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs Pull 9p fixes from Eric Van Hensbergen: "Misc set of fixes for 9p. Most of these clean up warnings we've gotten out of compilation tools, but several of them were from inspection while hunting down a couple of regressions. The most important one is75b396821c
("fs/9p: remove unnecessary and overrestrictive check") which caused a regression for some folks by restricting mmap in any case where writeback caches weren't enabled. Most of the other bugs caught via inspection were type mismatches" * tag '9p-fixes-6.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs: fs/9p: Remove unused extern declaration 9p: remove dead stores (variable set again without being read) 9p: virtio: skip incrementing unused variable 9p: virtio: make sure 'offs' is initialized in zc_request 9p: virtio: fix unlikely null pointer deref in handle_rerror 9p: fix ignored return value in v9fs_dir_release fs/9p: remove unnecessary invalidate_inode_pages2 fs/9p: fix type mismatch in file cache mode helper fs/9p: fix typo in comparison logic for cache mode fs/9p: remove unnecessary and overrestrictive check fs/9p: Fix a datatype used with V9FS_DIRECT_IO
This commit is contained in:
Коммит
28d79b746c
|
@ -46,8 +46,8 @@ static inline struct p9_fid *v9fs_fid_clone(struct dentry *dentry)
|
|||
* NOTE: these are set after open so only reflect 9p client not
|
||||
* underlying file system on server.
|
||||
*/
|
||||
static inline void v9fs_fid_add_modes(struct p9_fid *fid, int s_flags,
|
||||
int s_cache, unsigned int f_flags)
|
||||
static inline void v9fs_fid_add_modes(struct p9_fid *fid, unsigned int s_flags,
|
||||
unsigned int s_cache, unsigned int f_flags)
|
||||
{
|
||||
if (fid->qid.type != P9_QTFILE)
|
||||
return;
|
||||
|
@ -57,7 +57,7 @@ static inline void v9fs_fid_add_modes(struct p9_fid *fid, int s_flags,
|
|||
(s_flags & V9FS_DIRECT_IO) || (f_flags & O_DIRECT)) {
|
||||
fid->mode |= P9L_DIRECT; /* no read or write cache */
|
||||
} else if ((!(s_cache & CACHE_WRITEBACK)) ||
|
||||
(f_flags & O_DSYNC) | (s_flags & V9FS_SYNC)) {
|
||||
(f_flags & O_DSYNC) || (s_flags & V9FS_SYNC)) {
|
||||
fid->mode |= P9L_NOWRITECACHE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -545,8 +545,6 @@ void v9fs_session_begin_cancel(struct v9fs_session_info *v9ses)
|
|||
p9_client_begin_disconnect(v9ses->clnt);
|
||||
}
|
||||
|
||||
extern int v9fs_error_init(void);
|
||||
|
||||
static struct kobject *v9fs_kobj;
|
||||
|
||||
#ifdef CONFIG_9P_FSCACHE
|
||||
|
|
|
@ -108,7 +108,7 @@ enum p9_cache_bits {
|
|||
|
||||
struct v9fs_session_info {
|
||||
/* options */
|
||||
unsigned char flags;
|
||||
unsigned int flags;
|
||||
unsigned char nodev;
|
||||
unsigned short debug;
|
||||
unsigned int afid;
|
||||
|
|
|
@ -208,7 +208,7 @@ int v9fs_dir_release(struct inode *inode, struct file *filp)
|
|||
struct p9_fid *fid;
|
||||
__le32 version;
|
||||
loff_t i_size;
|
||||
int retval = 0;
|
||||
int retval = 0, put_err;
|
||||
|
||||
fid = filp->private_data;
|
||||
p9_debug(P9_DEBUG_VFS, "inode: %p filp: %p fid: %d\n",
|
||||
|
@ -221,7 +221,8 @@ int v9fs_dir_release(struct inode *inode, struct file *filp)
|
|||
spin_lock(&inode->i_lock);
|
||||
hlist_del(&fid->ilist);
|
||||
spin_unlock(&inode->i_lock);
|
||||
retval = p9_fid_put(fid);
|
||||
put_err = p9_fid_put(fid);
|
||||
retval = retval < 0 ? retval : put_err;
|
||||
}
|
||||
|
||||
if ((filp->f_mode & FMODE_WRITE)) {
|
||||
|
|
|
@ -505,10 +505,7 @@ v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma)
|
|||
p9_debug(P9_DEBUG_MMAP, "filp :%p\n", filp);
|
||||
|
||||
if (!(v9ses->cache & CACHE_WRITEBACK)) {
|
||||
p9_debug(P9_DEBUG_CACHE, "(no mmap mode)");
|
||||
if (vma->vm_flags & VM_MAYSHARE)
|
||||
return -ENODEV;
|
||||
invalidate_inode_pages2(filp->f_mapping);
|
||||
p9_debug(P9_DEBUG_CACHE, "(read-only mmap mode)");
|
||||
return generic_file_readonly_mmap(filp, vma);
|
||||
}
|
||||
|
||||
|
|
|
@ -163,7 +163,6 @@ int v9fs_uflags2omode(int uflags, int extended)
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = 0;
|
||||
switch (uflags&3) {
|
||||
default:
|
||||
case O_RDONLY:
|
||||
|
@ -603,7 +602,6 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
|
|||
|
||||
p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry);
|
||||
|
||||
err = 0;
|
||||
name = dentry->d_name.name;
|
||||
dfid = v9fs_parent_fid(dentry);
|
||||
if (IS_ERR(dfid)) {
|
||||
|
@ -815,8 +813,6 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry,
|
|||
if (!(flags & O_CREAT) || d_really_is_positive(dentry))
|
||||
return finish_no_open(file, res);
|
||||
|
||||
err = 0;
|
||||
|
||||
v9ses = v9fs_inode2v9ses(dir);
|
||||
perm = unixmode2p9mode(v9ses, mode);
|
||||
p9_omode = v9fs_uflags2omode(flags, v9fs_proto_dotu(v9ses));
|
||||
|
@ -912,7 +908,6 @@ v9fs_vfs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
|
|||
return -EINVAL;
|
||||
|
||||
p9_debug(P9_DEBUG_VFS, "\n");
|
||||
retval = 0;
|
||||
old_inode = d_inode(old_dentry);
|
||||
new_inode = d_inode(new_dentry);
|
||||
v9ses = v9fs_inode2v9ses(old_inode);
|
||||
|
@ -1066,7 +1061,6 @@ static int v9fs_vfs_setattr(struct mnt_idmap *idmap,
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
retval = -EPERM;
|
||||
v9ses = v9fs_dentry2v9ses(dentry);
|
||||
if (iattr->ia_valid & ATTR_FILE) {
|
||||
fid = iattr->ia_file->private_data;
|
||||
|
|
|
@ -366,7 +366,6 @@ static int v9fs_vfs_mkdir_dotl(struct mnt_idmap *idmap,
|
|||
struct posix_acl *dacl = NULL, *pacl = NULL;
|
||||
|
||||
p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry);
|
||||
err = 0;
|
||||
v9ses = v9fs_inode2v9ses(dir);
|
||||
|
||||
omode |= S_IFDIR;
|
||||
|
|
|
@ -904,7 +904,7 @@ EXPORT_SYMBOL(do_trace_9p_fid_put);
|
|||
|
||||
static int p9_client_version(struct p9_client *c)
|
||||
{
|
||||
int err = 0;
|
||||
int err;
|
||||
struct p9_req_t *req;
|
||||
char *version = NULL;
|
||||
int msize;
|
||||
|
@ -975,7 +975,6 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
|
|||
struct p9_client *clnt;
|
||||
char *client_id;
|
||||
|
||||
err = 0;
|
||||
clnt = kmalloc(sizeof(*clnt), GFP_KERNEL);
|
||||
if (!clnt)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
@ -1094,7 +1093,7 @@ struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,
|
|||
const char *uname, kuid_t n_uname,
|
||||
const char *aname)
|
||||
{
|
||||
int err = 0;
|
||||
int err;
|
||||
struct p9_req_t *req;
|
||||
struct p9_fid *fid;
|
||||
struct p9_qid qid;
|
||||
|
@ -1147,7 +1146,6 @@ struct p9_fid *p9_client_walk(struct p9_fid *oldfid, uint16_t nwname,
|
|||
struct p9_req_t *req;
|
||||
u16 nwqids, count;
|
||||
|
||||
err = 0;
|
||||
wqids = NULL;
|
||||
clnt = oldfid->clnt;
|
||||
if (clone) {
|
||||
|
@ -1224,7 +1222,6 @@ int p9_client_open(struct p9_fid *fid, int mode)
|
|||
clnt = fid->clnt;
|
||||
p9_debug(P9_DEBUG_9P, ">>> %s fid %d mode %d\n",
|
||||
p9_is_proto_dotl(clnt) ? "TLOPEN" : "TOPEN", fid->fid, mode);
|
||||
err = 0;
|
||||
|
||||
if (fid->mode != -1)
|
||||
return -EINVAL;
|
||||
|
@ -1262,7 +1259,7 @@ EXPORT_SYMBOL(p9_client_open);
|
|||
int p9_client_create_dotl(struct p9_fid *ofid, const char *name, u32 flags,
|
||||
u32 mode, kgid_t gid, struct p9_qid *qid)
|
||||
{
|
||||
int err = 0;
|
||||
int err;
|
||||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
int iounit;
|
||||
|
@ -1314,7 +1311,6 @@ int p9_client_fcreate(struct p9_fid *fid, const char *name, u32 perm, int mode,
|
|||
|
||||
p9_debug(P9_DEBUG_9P, ">>> TCREATE fid %d name %s perm %d mode %d\n",
|
||||
fid->fid, name, perm, mode);
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
if (fid->mode != -1)
|
||||
|
@ -1350,7 +1346,7 @@ EXPORT_SYMBOL(p9_client_fcreate);
|
|||
int p9_client_symlink(struct p9_fid *dfid, const char *name,
|
||||
const char *symtgt, kgid_t gid, struct p9_qid *qid)
|
||||
{
|
||||
int err = 0;
|
||||
int err;
|
||||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
|
@ -1402,13 +1398,12 @@ EXPORT_SYMBOL(p9_client_link);
|
|||
|
||||
int p9_client_fsync(struct p9_fid *fid, int datasync)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
p9_debug(P9_DEBUG_9P, ">>> TFSYNC fid %d datasync:%d\n",
|
||||
fid->fid, datasync);
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
req = p9_client_rpc(clnt, P9_TFSYNC, "dd", fid->fid, datasync);
|
||||
|
@ -1428,7 +1423,7 @@ EXPORT_SYMBOL(p9_client_fsync);
|
|||
|
||||
int p9_client_clunk(struct p9_fid *fid)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
int retries = 0;
|
||||
|
@ -1436,7 +1431,6 @@ int p9_client_clunk(struct p9_fid *fid)
|
|||
again:
|
||||
p9_debug(P9_DEBUG_9P, ">>> TCLUNK fid %d (try %d)\n",
|
||||
fid->fid, retries);
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
req = p9_client_rpc(clnt, P9_TCLUNK, "d", fid->fid);
|
||||
|
@ -1465,12 +1459,11 @@ EXPORT_SYMBOL(p9_client_clunk);
|
|||
|
||||
int p9_client_remove(struct p9_fid *fid)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
p9_debug(P9_DEBUG_9P, ">>> TREMOVE fid %d\n", fid->fid);
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
req = p9_client_rpc(clnt, P9_TREMOVE, "d", fid->fid);
|
||||
|
@ -1680,7 +1673,6 @@ struct p9_wstat *p9_client_stat(struct p9_fid *fid)
|
|||
if (!ret)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
req = p9_client_rpc(clnt, P9_TSTAT, "d", fid->fid);
|
||||
|
@ -1733,7 +1725,6 @@ struct p9_stat_dotl *p9_client_getattr_dotl(struct p9_fid *fid,
|
|||
if (!ret)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
req = p9_client_rpc(clnt, P9_TGETATTR, "dq", fid->fid, request_mask);
|
||||
|
@ -1812,11 +1803,10 @@ static int p9_client_statsize(struct p9_wstat *wst, int proto_version)
|
|||
|
||||
int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_req_t *req;
|
||||
struct p9_client *clnt;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
wst->size = p9_client_statsize(wst, clnt->proto_version);
|
||||
p9_debug(P9_DEBUG_9P, ">>> TWSTAT fid %d\n",
|
||||
|
@ -1851,11 +1841,10 @@ EXPORT_SYMBOL(p9_client_wstat);
|
|||
|
||||
int p9_client_setattr(struct p9_fid *fid, struct p9_iattr_dotl *p9attr)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_req_t *req;
|
||||
struct p9_client *clnt;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
p9_debug(P9_DEBUG_9P, ">>> TSETATTR fid %d\n", fid->fid);
|
||||
p9_debug(P9_DEBUG_9P, " valid=%x mode=%x uid=%d gid=%d size=%lld\n",
|
||||
|
@ -1887,7 +1876,6 @@ int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb)
|
|||
struct p9_req_t *req;
|
||||
struct p9_client *clnt;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
p9_debug(P9_DEBUG_9P, ">>> TSTATFS fid %d\n", fid->fid);
|
||||
|
@ -1921,11 +1909,10 @@ EXPORT_SYMBOL(p9_client_statfs);
|
|||
int p9_client_rename(struct p9_fid *fid,
|
||||
struct p9_fid *newdirfid, const char *name)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_req_t *req;
|
||||
struct p9_client *clnt;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
p9_debug(P9_DEBUG_9P, ">>> TRENAME fid %d newdirfid %d name %s\n",
|
||||
|
@ -1949,11 +1936,10 @@ EXPORT_SYMBOL(p9_client_rename);
|
|||
int p9_client_renameat(struct p9_fid *olddirfid, const char *old_name,
|
||||
struct p9_fid *newdirfid, const char *new_name)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_req_t *req;
|
||||
struct p9_client *clnt;
|
||||
|
||||
err = 0;
|
||||
clnt = olddirfid->clnt;
|
||||
|
||||
p9_debug(P9_DEBUG_9P,
|
||||
|
@ -1986,7 +1972,6 @@ struct p9_fid *p9_client_xattrwalk(struct p9_fid *file_fid,
|
|||
struct p9_client *clnt;
|
||||
struct p9_fid *attr_fid;
|
||||
|
||||
err = 0;
|
||||
clnt = file_fid->clnt;
|
||||
attr_fid = p9_fid_create(clnt);
|
||||
if (!attr_fid) {
|
||||
|
@ -2027,14 +2012,13 @@ EXPORT_SYMBOL_GPL(p9_client_xattrwalk);
|
|||
int p9_client_xattrcreate(struct p9_fid *fid, const char *name,
|
||||
u64 attr_size, int flags)
|
||||
{
|
||||
int err;
|
||||
int err = 0;
|
||||
struct p9_req_t *req;
|
||||
struct p9_client *clnt;
|
||||
|
||||
p9_debug(P9_DEBUG_9P,
|
||||
">>> TXATTRCREATE fid %d name %s size %llu flag %d\n",
|
||||
fid->fid, name, attr_size, flags);
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
req = p9_client_rpc(clnt, P9_TXATTRCREATE, "dsqd",
|
||||
fid->fid, name, attr_size, flags);
|
||||
|
@ -2063,7 +2047,6 @@ int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset)
|
|||
p9_debug(P9_DEBUG_9P, ">>> TREADDIR fid %d offset %llu count %d\n",
|
||||
fid->fid, offset, count);
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
|
||||
rsize = fid->iounit;
|
||||
|
@ -2122,7 +2105,6 @@ int p9_client_mknod_dotl(struct p9_fid *fid, const char *name, int mode,
|
|||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
p9_debug(P9_DEBUG_9P,
|
||||
">>> TMKNOD fid %d name %s mode %d major %d minor %d\n",
|
||||
|
@ -2153,7 +2135,6 @@ int p9_client_mkdir_dotl(struct p9_fid *fid, const char *name, int mode,
|
|||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
p9_debug(P9_DEBUG_9P, ">>> TMKDIR fid %d name %s mode %d gid %d\n",
|
||||
fid->fid, name, mode, from_kgid(&init_user_ns, gid));
|
||||
|
@ -2182,7 +2163,6 @@ int p9_client_lock_dotl(struct p9_fid *fid, struct p9_flock *flock, u8 *status)
|
|||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
p9_debug(P9_DEBUG_9P,
|
||||
">>> TLOCK fid %d type %i flags %d start %lld length %lld proc_id %d client_id %s\n",
|
||||
|
@ -2214,7 +2194,6 @@ int p9_client_getlock_dotl(struct p9_fid *fid, struct p9_getlock *glock)
|
|||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
p9_debug(P9_DEBUG_9P,
|
||||
">>> TGETLOCK fid %d, type %i start %lld length %lld proc_id %d client_id %s\n",
|
||||
|
@ -2251,7 +2230,6 @@ int p9_client_readlink(struct p9_fid *fid, char **target)
|
|||
struct p9_client *clnt;
|
||||
struct p9_req_t *req;
|
||||
|
||||
err = 0;
|
||||
clnt = fid->clnt;
|
||||
p9_debug(P9_DEBUG_9P, ">>> TREADLINK fid %d\n", fid->fid);
|
||||
|
||||
|
|
|
@ -384,7 +384,7 @@ static void handle_rerror(struct p9_req_t *req, int in_hdr_len,
|
|||
void *to = req->rc.sdata + in_hdr_len;
|
||||
|
||||
// Fits entirely into the static data? Nothing to do.
|
||||
if (req->rc.size < in_hdr_len)
|
||||
if (req->rc.size < in_hdr_len || !pages)
|
||||
return;
|
||||
|
||||
// Really long error message? Tough, truncate the reply. Might get
|
||||
|
@ -428,7 +428,7 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req,
|
|||
struct page **in_pages = NULL, **out_pages = NULL;
|
||||
struct virtio_chan *chan = client->trans;
|
||||
struct scatterlist *sgs[4];
|
||||
size_t offs;
|
||||
size_t offs = 0;
|
||||
int need_drop = 0;
|
||||
int kicked = 0;
|
||||
|
||||
|
@ -501,8 +501,8 @@ req_retry_pinned:
|
|||
|
||||
if (in_pages) {
|
||||
sgs[out_sgs + in_sgs++] = chan->sg + out + in;
|
||||
in += pack_sg_list_p(chan->sg, out + in, VIRTQUEUE_NUM,
|
||||
in_pages, in_nr_pages, offs, inlen);
|
||||
pack_sg_list_p(chan->sg, out + in, VIRTQUEUE_NUM,
|
||||
in_pages, in_nr_pages, offs, inlen);
|
||||
}
|
||||
|
||||
BUG_ON(out_sgs + in_sgs > ARRAY_SIZE(sgs));
|
||||
|
|
Загрузка…
Ссылка в новой задаче