diff options
Diffstat (limited to 'fs/9p/vfs_inode.c')
| -rw-r--r-- | fs/9p/vfs_inode.c | 29 | 
1 files changed, 18 insertions, 11 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 08f48b70a741..328c338ff304 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -1,7 +1,5 @@  // SPDX-License-Identifier: GPL-2.0-only  /* - *  linux/fs/9p/vfs_inode.c - *   * This file contains vfs inode ops for the 9P2000 protocol.   *   *  Copyright (C) 2004 by Eric Van Hensbergen <[email protected]> @@ -49,6 +47,7 @@ static const struct inode_operations v9fs_symlink_inode_operations;  static u32 unixmode2p9mode(struct v9fs_session_info *v9ses, umode_t mode)  {  	int res; +  	res = mode & 0777;  	if (S_ISDIR(mode))  		res |= P9_DMDIR; @@ -110,7 +109,7 @@ static int p9mode2perm(struct v9fs_session_info *v9ses,  static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses,  			       struct p9_wstat *stat, dev_t *rdev)  { -	int res; +	int res, r;  	u32 mode = stat->mode;  	*rdev = 0; @@ -128,11 +127,16 @@ static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses,  		res |= S_IFIFO;  	else if ((mode & P9_DMDEVICE) && (v9fs_proto_dotu(v9ses))  		 && (v9ses->nodev == 0)) { -		char type = 0, ext[32]; +		char type = 0;  		int major = -1, minor = -1; -		strlcpy(ext, stat->extension, sizeof(ext)); -		sscanf(ext, "%c %i %i", &type, &major, &minor); +		r = sscanf(stat->extension, "%c %i %i", &type, &major, &minor); +		if (r != 3) { +			p9_debug(P9_DEBUG_ERROR, +				 "invalid device string, umode will be bogus: %s\n", +				 stat->extension); +			return res; +		}  		switch (type) {  		case 'c':  			res |= S_IFCHR; @@ -223,6 +227,7 @@ v9fs_blank_wstat(struct p9_wstat *wstat)  struct inode *v9fs_alloc_inode(struct super_block *sb)  {  	struct v9fs_inode *v9inode; +  	v9inode = kmem_cache_alloc(v9fs_inode_cache, GFP_KERNEL);  	if (!v9inode)  		return NULL; @@ -251,7 +256,7 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses,  {  	int err = 0; -	inode_init_owner(&init_user_ns,inode,  NULL, mode); +	inode_init_owner(&init_user_ns, inode, NULL, mode);  	inode->i_blocks = 0;  	inode->i_rdev = rdev;  	inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode); @@ -440,7 +445,7 @@ static struct inode *v9fs_qid_iget(struct super_block *sb,  	unsigned long i_ino;  	struct inode *inode;  	struct v9fs_session_info *v9ses = sb->s_fs_info; -	int (*test)(struct inode *, void *); +	int (*test)(struct inode *inode, void *data);  	if (new)  		test = v9fs_test_new_inode; @@ -499,8 +504,10 @@ v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid,  static int v9fs_at_to_dotl_flags(int flags)  {  	int rflags = 0; +  	if (flags & AT_REMOVEDIR)  		rflags |= P9_DOTL_AT_REMOVEDIR; +  	return rflags;  } @@ -797,7 +804,7 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,  static int  v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry, -		     struct file *file, unsigned flags, umode_t mode) +		     struct file *file, unsigned int flags, umode_t mode)  {  	int err;  	u32 perm; @@ -1084,7 +1091,7 @@ static int v9fs_vfs_setattr(struct user_namespace *mnt_userns,  		fid = v9fs_fid_lookup(dentry);  		use_dentry = 1;  	} -	if(IS_ERR(fid)) +	if (IS_ERR(fid))  		return PTR_ERR(fid);  	v9fs_blank_wstat(&wstat); @@ -1364,7 +1371,7 @@ v9fs_vfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,  	char name[2 + U32_MAX_DIGITS + 1 + U32_MAX_DIGITS + 1];  	u32 perm; -	p9_debug(P9_DEBUG_VFS, " %lu,%pd mode: %hx MAJOR: %u MINOR: %u\n", +	p9_debug(P9_DEBUG_VFS, " %lu,%pd mode: %x MAJOR: %u MINOR: %u\n",  		 dir->i_ino, dentry, mode,  		 MAJOR(rdev), MINOR(rdev));  |