hw/9pfs: Add open flag mapping
Some of the flags are OS/arch dependent we need to use 9P defined value on wire, Based on the original patch from Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> Signed-off-by: M. Mohan Kumar <mohan@in.ibm.com> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
This commit is contained in:
parent
a2f507d908
commit
9844081bca
@ -72,6 +72,55 @@ static int omode_to_uflags(int8_t mode)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dotl_to_at_flags(int flags)
|
||||||
|
{
|
||||||
|
int rflags = 0;
|
||||||
|
if (flags & P9_DOTL_AT_REMOVEDIR) {
|
||||||
|
rflags |= AT_REMOVEDIR;
|
||||||
|
}
|
||||||
|
return rflags;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dotl_openflag_map {
|
||||||
|
int dotl_flag;
|
||||||
|
int open_flag;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int dotl_to_open_flags(int flags)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
/*
|
||||||
|
* We have same bits for P9_DOTL_READONLY, P9_DOTL_WRONLY
|
||||||
|
* and P9_DOTL_NOACCESS
|
||||||
|
*/
|
||||||
|
int oflags = flags & O_ACCMODE;
|
||||||
|
|
||||||
|
struct dotl_openflag_map dotl_oflag_map[] = {
|
||||||
|
{ P9_DOTL_CREATE, O_CREAT },
|
||||||
|
{ P9_DOTL_EXCL, O_EXCL },
|
||||||
|
{ P9_DOTL_NOCTTY , O_NOCTTY },
|
||||||
|
{ P9_DOTL_TRUNC, O_TRUNC },
|
||||||
|
{ P9_DOTL_APPEND, O_APPEND },
|
||||||
|
{ P9_DOTL_NONBLOCK, O_NONBLOCK } ,
|
||||||
|
{ P9_DOTL_DSYNC, O_DSYNC },
|
||||||
|
{ P9_DOTL_FASYNC, FASYNC },
|
||||||
|
{ P9_DOTL_DIRECT, O_DIRECT },
|
||||||
|
{ P9_DOTL_LARGEFILE, O_LARGEFILE },
|
||||||
|
{ P9_DOTL_DIRECTORY, O_DIRECTORY },
|
||||||
|
{ P9_DOTL_NOFOLLOW, O_NOFOLLOW },
|
||||||
|
{ P9_DOTL_NOATIME, O_NOATIME },
|
||||||
|
{ P9_DOTL_SYNC, O_SYNC },
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(dotl_oflag_map); i++) {
|
||||||
|
if (flags & dotl_oflag_map[i].dotl_flag) {
|
||||||
|
oflags |= dotl_oflag_map[i].open_flag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return oflags;
|
||||||
|
}
|
||||||
|
|
||||||
void cred_init(FsCred *credp)
|
void cred_init(FsCred *credp)
|
||||||
{
|
{
|
||||||
credp->fc_uid = -1;
|
credp->fc_uid = -1;
|
||||||
@ -86,7 +135,8 @@ static int get_dotl_openflags(V9fsState *s, int oflags)
|
|||||||
/*
|
/*
|
||||||
* Filter the client open flags
|
* Filter the client open flags
|
||||||
*/
|
*/
|
||||||
flags = oflags & ~(O_NOCTTY | O_ASYNC | O_CREAT);
|
flags = dotl_to_open_flags(oflags);
|
||||||
|
flags &= ~(O_NOCTTY | O_ASYNC | O_CREAT);
|
||||||
/*
|
/*
|
||||||
* Ignore direct disk access hint until the server supports it.
|
* Ignore direct disk access hint until the server supports it.
|
||||||
*/
|
*/
|
||||||
@ -2427,6 +2477,7 @@ static void v9fs_unlinkat(void *opaque)
|
|||||||
V9fsPDU *pdu = opaque;
|
V9fsPDU *pdu = opaque;
|
||||||
|
|
||||||
pdu_unmarshal(pdu, offset, "dsd", &dfid, &name, &flags);
|
pdu_unmarshal(pdu, offset, "dsd", &dfid, &name, &flags);
|
||||||
|
flags = dotl_to_at_flags(flags);
|
||||||
|
|
||||||
dfidp = get_fid(pdu, dfid);
|
dfidp = get_fid(pdu, dfid);
|
||||||
if (dfidp == NULL) {
|
if (dfidp == NULL) {
|
||||||
|
@ -352,6 +352,30 @@ typedef struct V9fsMkState {
|
|||||||
V9fsString fullname;
|
V9fsString fullname;
|
||||||
} V9fsMkState;
|
} V9fsMkState;
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
|
||||||
/* 9P2000.L lock type */
|
/* 9P2000.L lock type */
|
||||||
#define P9_LOCK_TYPE_RDLCK 0
|
#define P9_LOCK_TYPE_RDLCK 0
|
||||||
#define P9_LOCK_TYPE_WRLCK 1
|
#define P9_LOCK_TYPE_WRLCK 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user