Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f88657ce authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Eric Van Hensbergen
Browse files

fs/9p: Add OS dependent open flags in 9p protocol



Some of the flags are OS/arch dependent we add a 9p
protocol value which maps to asm-generic/fcntl.h values in Linux
Based on the original patch from Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
parent b49d8b5d
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -83,4 +83,6 @@ static inline void v9fs_invalidate_inode_attr(struct inode *inode)
	v9inode->cache_validity |= V9FS_INO_INVALID_ATTR;
	v9inode->cache_validity |= V9FS_INO_INVALID_ATTR;
	return;
	return;
}
}

int v9fs_open_to_dotl_flags(int flags);
#endif
#endif
+1 −1
Original line number Original line Diff line number Diff line
@@ -65,7 +65,7 @@ int v9fs_file_open(struct inode *inode, struct file *file)
	v9inode = V9FS_I(inode);
	v9inode = V9FS_I(inode);
	v9ses = v9fs_inode2v9ses(inode);
	v9ses = v9fs_inode2v9ses(inode);
	if (v9fs_proto_dotl(v9ses))
	if (v9fs_proto_dotl(v9ses))
		omode = file->f_flags;
		omode = v9fs_open_to_dotl_flags(file->f_flags);
	else
	else
		omode = v9fs_uflags2omode(file->f_flags,
		omode = v9fs_uflags2omode(file->f_flags,
					v9fs_proto_dotu(v9ses));
					v9fs_proto_dotu(v9ses));
+15 −1
Original line number Original line Diff line number Diff line
@@ -552,6 +552,19 @@ v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid,
	return inode;
	return inode;
}
}


/**
 * v9fs_at_to_dotl_flags- convert Linux specific AT flags to
 * plan 9 AT flag.
 * @flags: flags to convert
 */
static int v9fs_at_to_dotl_flags(int flags)
{
	int rflags = 0;
	if (flags & AT_REMOVEDIR)
		rflags |= P9_DOTL_AT_REMOVEDIR;
	return rflags;
}

/**
/**
 * v9fs_remove - helper function to remove files and directories
 * v9fs_remove - helper function to remove files and directories
 * @dir: directory inode that is being deleted
 * @dir: directory inode that is being deleted
@@ -579,7 +592,8 @@ static int v9fs_remove(struct inode *dir, struct dentry *dentry, int flags)
		return retval;
		return retval;
	}
	}
	if (v9fs_proto_dotl(v9ses))
	if (v9fs_proto_dotl(v9ses))
		retval = p9_client_unlinkat(dfid, dentry->d_name.name, flags);
		retval = p9_client_unlinkat(dfid, dentry->d_name.name,
					    v9fs_at_to_dotl_flags(flags));
	if (retval == -EOPNOTSUPP) {
	if (retval == -EOPNOTSUPP) {
		/* Try the one based on path */
		/* Try the one based on path */
		v9fid = v9fs_fid_clone(dentry);
		v9fid = v9fs_fid_clone(dentry);
+54 −1
Original line number Original line Diff line number Diff line
@@ -191,6 +191,58 @@ v9fs_inode_from_fid_dotl(struct v9fs_session_info *v9ses, struct p9_fid *fid,
	return inode;
	return inode;
}
}


struct dotl_openflag_map {
	int open_flag;
	int dotl_flag;
};

static int v9fs_mapped_dotl_flags(int flags)
{
	int i;
	int rflags = 0;
	struct dotl_openflag_map dotl_oflag_map[] = {
		{ O_CREAT,	P9_DOTL_CREATE },
		{ O_EXCL,	P9_DOTL_EXCL },
		{ O_NOCTTY,	P9_DOTL_NOCTTY },
		{ O_TRUNC,	P9_DOTL_TRUNC },
		{ O_APPEND,	P9_DOTL_APPEND },
		{ O_NONBLOCK,	P9_DOTL_NONBLOCK },
		{ O_DSYNC,	P9_DOTL_DSYNC },
		{ FASYNC,	P9_DOTL_FASYNC },
		{ O_DIRECT,	P9_DOTL_DIRECT },
		{ O_LARGEFILE,	P9_DOTL_LARGEFILE },
		{ O_DIRECTORY,	P9_DOTL_DIRECTORY },
		{ O_NOFOLLOW,	P9_DOTL_NOFOLLOW },
		{ O_NOATIME,	P9_DOTL_NOATIME },
		{ O_CLOEXEC,	P9_DOTL_CLOEXEC },
		{ O_SYNC,	P9_DOTL_SYNC},
	};
	for (i = 0; i < ARRAY_SIZE(dotl_oflag_map); i++) {
		if (flags & dotl_oflag_map[i].open_flag)
			rflags |= dotl_oflag_map[i].dotl_flag;
	}
	return rflags;
}

/**
 * v9fs_open_to_dotl_flags- convert Linux specific open flags to
 * plan 9 open flag.
 * @flags: flags to convert
 */
int v9fs_open_to_dotl_flags(int flags)
{
	int rflags = 0;

	/*
	 * We have same bits for P9_DOTL_READONLY, P9_DOTL_WRONLY
	 * and P9_DOTL_NOACCESS
	 */
	rflags |= flags & O_ACCMODE;
	rflags |= v9fs_mapped_dotl_flags(flags);

	return rflags;
}

/**
/**
 * v9fs_vfs_create_dotl - VFS hook to create files for 9P2000.L protocol.
 * v9fs_vfs_create_dotl - VFS hook to create files for 9P2000.L protocol.
 * @dir: directory inode that is being created
 * @dir: directory inode that is being created
@@ -259,7 +311,8 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
			   "Failed to get acl values in creat %d\n", err);
			   "Failed to get acl values in creat %d\n", err);
		goto error;
		goto error;
	}
	}
	err = p9_client_create_dotl(ofid, name, flags, mode, gid, &qid);
	err = p9_client_create_dotl(ofid, name, v9fs_open_to_dotl_flags(flags),
				    mode, gid, &qid);
	if (err < 0) {
	if (err < 0) {
		P9_DPRINTK(P9_DEBUG_VFS,
		P9_DPRINTK(P9_DEBUG_VFS,
				"p9_client_open_dotl failed in creat %d\n",
				"p9_client_open_dotl failed in creat %d\n",
+24 −0
Original line number Original line Diff line number Diff line
@@ -288,6 +288,30 @@ enum p9_perm_t {
	P9_DMSETVTX = 0x00010000,
	P9_DMSETVTX = 0x00010000,
};
};


/* 9p2000.L open flags */
#define P9_DOTL_RDONLY        00000000
#define P9_DOTL_WRONLY        00000001
#define P9_DOTL_RDWR          00000002
#define P9_DOTL_NOACCESS      00000003
#define P9_DOTL_CREATE        00000100
#define P9_DOTL_EXCL          00000200
#define P9_DOTL_NOCTTY        00000400
#define P9_DOTL_TRUNC         00001000
#define P9_DOTL_APPEND        00002000
#define P9_DOTL_NONBLOCK      00004000
#define P9_DOTL_DSYNC         00010000
#define P9_DOTL_FASYNC        00020000
#define P9_DOTL_DIRECT        00040000
#define P9_DOTL_LARGEFILE     00100000
#define P9_DOTL_DIRECTORY     00200000
#define P9_DOTL_NOFOLLOW      00400000
#define P9_DOTL_NOATIME       01000000
#define P9_DOTL_CLOEXEC       02000000
#define P9_DOTL_SYNC          04000000

/* 9p2000.L at flags */
#define P9_DOTL_AT_REMOVEDIR		0x200

/**
/**
 * enum p9_qid_t - QID types
 * enum p9_qid_t - QID types
 * @P9_QTDIR: directory
 * @P9_QTDIR: directory