Message types for VFS lookup
Change-Id: Ic4d2a616ebc986c4b405b6b9ee0bd7c3b59e81d2
This commit is contained in:
@@ -44,12 +44,12 @@ int fs_lookup()
|
||||
pino_t dir_ino, root_ino;
|
||||
struct inode *rip;
|
||||
|
||||
grant = (cp_grant_id_t) fs_m_in.REQ_GRANT;
|
||||
path_size = (size_t) fs_m_in.REQ_PATH_SIZE; /* Size of the buffer */
|
||||
len = (int) fs_m_in.REQ_PATH_LEN; /* including terminating nul */
|
||||
dir_ino = (pino_t) fs_m_in.REQ_DIR_INO;
|
||||
root_ino = (pino_t) fs_m_in.REQ_ROOT_INO;
|
||||
flags = (int) fs_m_in.REQ_FLAGS;
|
||||
grant = fs_m_in.m_vfs_fs_lookup.grant_path;
|
||||
path_size = fs_m_in.m_vfs_fs_lookup.path_size; /* Size of the buffer */
|
||||
len = fs_m_in.m_vfs_fs_lookup.path_len; /* including terminating nul */
|
||||
dir_ino = fs_m_in.m_vfs_fs_lookup.dir_ino;
|
||||
root_ino = fs_m_in.m_vfs_fs_lookup.root_ino;
|
||||
flags = fs_m_in.m_vfs_fs_lookup.flags;
|
||||
|
||||
/* Check length. */
|
||||
if(len > sizeof(user_path)) return(E2BIG); /* too big for buffer */
|
||||
@@ -65,13 +65,12 @@ int fs_lookup()
|
||||
|
||||
memset(&credentials, 0, sizeof(credentials));
|
||||
if(!(flags & PATH_GET_UCRED)) { /* Do we have to copy uid/gid credentials? */
|
||||
caller_uid = (uid_t) fs_m_in.REQ_UID;
|
||||
caller_gid = (gid_t) fs_m_in.REQ_GID;
|
||||
caller_uid = fs_m_in.m_vfs_fs_lookup.uid;
|
||||
caller_gid = fs_m_in.m_vfs_fs_lookup.gid;
|
||||
} else {
|
||||
if((r=fs_lookup_credentials(&credentials,
|
||||
&caller_uid, &caller_gid,
|
||||
(cp_grant_id_t) fs_m_in.REQ_GRANT2,
|
||||
(size_t) fs_m_in.REQ_UCRED_SIZE)) != OK)
|
||||
&caller_uid, &caller_gid, fs_m_in.m_vfs_fs_lookup.grant_ucred,
|
||||
fs_m_in.m_vfs_fs_lookup.ucred_size)) != OK)
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -90,27 +89,27 @@ int fs_lookup()
|
||||
|
||||
if(r == ELEAVEMOUNT || r == ESYMLINK) {
|
||||
/* Report offset and the error */
|
||||
fs_m_out.RES_OFFSET = offset;
|
||||
fs_m_out.RES_SYMLOOP = symlinks;
|
||||
fs_m_out.m_fs_vfs_lookup.offset = offset;
|
||||
fs_m_out.m_fs_vfs_lookup.symloop = symlinks;
|
||||
|
||||
return(r);
|
||||
}
|
||||
|
||||
if (r != OK && r != EENTERMOUNT) return(r);
|
||||
|
||||
fs_m_out.RES_INODE_NR = rip->i_num;
|
||||
fs_m_out.RES_MODE = rip->i_mode;
|
||||
fs_m_out.RES_FILE_SIZE = rip->i_size;
|
||||
fs_m_out.RES_SYMLOOP = symlinks;
|
||||
fs_m_out.RES_UID = rip->i_uid;
|
||||
fs_m_out.RES_GID = rip->i_gid;
|
||||
fs_m_out.m_fs_vfs_lookup.inode = rip->i_num;
|
||||
fs_m_out.m_fs_vfs_lookup.mode = rip->i_mode;
|
||||
fs_m_out.m_fs_vfs_lookup.file_size = rip->i_size;
|
||||
fs_m_out.m_fs_vfs_lookup.symloop = symlinks;
|
||||
fs_m_out.m_fs_vfs_lookup.uid = rip->i_uid;
|
||||
fs_m_out.m_fs_vfs_lookup.gid = rip->i_gid;
|
||||
|
||||
/* This is only valid for block and character specials. But it doesn't
|
||||
* cause any harm to set RES_DEV always. */
|
||||
fs_m_out.RES_DEV = (dev_t) rip->i_block[0];
|
||||
* cause any harm to always set the device field. */
|
||||
fs_m_out.m_fs_vfs_lookup.device = (dev_t) rip->i_block[0];
|
||||
|
||||
if(r == EENTERMOUNT) {
|
||||
fs_m_out.RES_OFFSET = offset;
|
||||
fs_m_out.m_fs_vfs_lookup.offset = offset;
|
||||
put_inode(rip); /* Only return a reference to the final object */
|
||||
}
|
||||
|
||||
|
||||
@@ -17,16 +17,16 @@ int fs_lookup() {
|
||||
cp_grant_id_t grant;
|
||||
int r, len, flags;
|
||||
size_t offset;
|
||||
pino_t dir_ino, root_ino;
|
||||
ino_t dir_ino, root_ino;
|
||||
struct dir_record *dir;
|
||||
|
||||
grant = fs_m_in.REQ_GRANT;
|
||||
len = fs_m_in.REQ_PATH_LEN; /* including terminating nul */
|
||||
dir_ino = (pino_t) fs_m_in.REQ_DIR_INO;
|
||||
root_ino = (pino_t) fs_m_in.REQ_ROOT_INO;
|
||||
flags = fs_m_in.REQ_FLAGS;
|
||||
caller_uid = (uid_t) fs_m_in.REQ_UID;
|
||||
caller_gid = (gid_t) fs_m_in.REQ_GID;
|
||||
grant = fs_m_in.m_vfs_fs_lookup.grant_path;
|
||||
len = fs_m_in.m_vfs_fs_lookup.path_len; /* including terminating nul */
|
||||
dir_ino = fs_m_in.m_vfs_fs_lookup.dir_ino;
|
||||
root_ino = fs_m_in.m_vfs_fs_lookup.root_ino;
|
||||
flags = fs_m_in.m_vfs_fs_lookup.flags;
|
||||
caller_uid = fs_m_in.m_vfs_fs_lookup.uid;
|
||||
caller_gid = fs_m_in.m_vfs_fs_lookup.gid;
|
||||
|
||||
/* Check length. */
|
||||
if(len > sizeof(user_path)) return(E2BIG); /* too big for buffer */
|
||||
@@ -51,23 +51,22 @@ int fs_lookup() {
|
||||
|
||||
if (r == ELEAVEMOUNT) {
|
||||
/* Report offset and the error */
|
||||
fs_m_out.RES_OFFSET = offset;
|
||||
fs_m_out.RES_SYMLOOP = 0;
|
||||
fs_m_out.m_fs_vfs_lookup.offset = offset;
|
||||
fs_m_out.m_fs_vfs_lookup.symloop = 0;
|
||||
return(r);
|
||||
}
|
||||
|
||||
if (r != OK && r != EENTERMOUNT) return(r);
|
||||
|
||||
fs_m_out.RES_INODE_NR = ID_DIR_RECORD(dir);
|
||||
fs_m_out.RES_MODE = dir->d_mode;
|
||||
fs_m_out.RES_FILE_SIZE = dir->d_file_size;
|
||||
fs_m_out.RES_SYMLOOP = 0;
|
||||
fs_m_out.RES_UID = SYS_UID; /* root */
|
||||
fs_m_out.RES_GID = SYS_GID; /* operator */
|
||||
|
||||
fs_m_out.m_fs_vfs_lookup.inode = ID_DIR_RECORD(dir);
|
||||
fs_m_out.m_fs_vfs_lookup.mode = dir->d_mode;
|
||||
fs_m_out.m_fs_vfs_lookup.file_size = dir->d_file_size;
|
||||
fs_m_out.m_fs_vfs_lookup.symloop = 0;
|
||||
fs_m_out.m_fs_vfs_lookup.uid = SYS_UID; /* root */
|
||||
fs_m_out.m_fs_vfs_lookup.gid = SYS_GID; /* operator */
|
||||
|
||||
if (r == EENTERMOUNT) {
|
||||
fs_m_out.RES_OFFSET = offset;
|
||||
fs_m_out.m_fs_vfs_lookup.offset = offset;
|
||||
release_dir_record(dir);
|
||||
}
|
||||
|
||||
|
||||
@@ -40,15 +40,15 @@ int fs_lookup()
|
||||
int r, r1, flags, symlinks;
|
||||
unsigned int len;
|
||||
size_t offset = 0, path_size;
|
||||
pino_t dir_ino, root_ino;
|
||||
ino_t dir_ino, root_ino;
|
||||
struct inode *rip;
|
||||
|
||||
grant = (cp_grant_id_t) fs_m_in.REQ_GRANT;
|
||||
path_size = (size_t) fs_m_in.REQ_PATH_SIZE; /* Size of the buffer */
|
||||
len = (int) fs_m_in.REQ_PATH_LEN; /* including terminating nul */
|
||||
dir_ino = (pino_t) fs_m_in.REQ_DIR_INO;
|
||||
root_ino = (pino_t) fs_m_in.REQ_ROOT_INO;
|
||||
flags = (int) fs_m_in.REQ_FLAGS;
|
||||
grant = fs_m_in.m_vfs_fs_lookup.grant_path;
|
||||
path_size = fs_m_in.m_vfs_fs_lookup.path_size; /* Size of the buffer */
|
||||
len = fs_m_in.m_vfs_fs_lookup.path_len; /* including terminating nul */
|
||||
dir_ino = fs_m_in.m_vfs_fs_lookup.dir_ino;
|
||||
root_ino = fs_m_in.m_vfs_fs_lookup.root_ino;
|
||||
flags = fs_m_in.m_vfs_fs_lookup.flags;
|
||||
|
||||
/* Check length. */
|
||||
if(len > sizeof(user_path)) return(E2BIG); /* too big for buffer */
|
||||
@@ -64,13 +64,13 @@ int fs_lookup()
|
||||
|
||||
memset(&credentials, 0, sizeof(credentials));
|
||||
if(!(flags & PATH_GET_UCRED)) { /* Do we have to copy uid/gid credentials? */
|
||||
caller_uid = (uid_t) fs_m_in.REQ_UID;
|
||||
caller_gid = (gid_t) fs_m_in.REQ_GID;
|
||||
caller_uid = fs_m_in.m_vfs_fs_lookup.uid;
|
||||
caller_gid = fs_m_in.m_vfs_fs_lookup.gid;
|
||||
} else {
|
||||
if((r=fs_lookup_credentials(&credentials,
|
||||
&caller_uid, &caller_gid,
|
||||
(cp_grant_id_t) fs_m_in.REQ_GRANT2,
|
||||
(size_t) fs_m_in.REQ_UCRED_SIZE)) != OK)
|
||||
fs_m_in.m_vfs_fs_lookup.grant_ucred,
|
||||
fs_m_in.m_vfs_fs_lookup.ucred_size)) != OK)
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -89,27 +89,27 @@ int fs_lookup()
|
||||
|
||||
if(r == ELEAVEMOUNT || r == ESYMLINK) {
|
||||
/* Report offset and the error */
|
||||
fs_m_out.RES_OFFSET = offset;
|
||||
fs_m_out.RES_SYMLOOP = symlinks;
|
||||
fs_m_out.m_fs_vfs_lookup.offset = offset;
|
||||
fs_m_out.m_fs_vfs_lookup.symloop = symlinks;
|
||||
|
||||
return(r);
|
||||
}
|
||||
|
||||
if (r != OK && r != EENTERMOUNT) return(r);
|
||||
|
||||
fs_m_out.RES_INODE_NR = rip->i_num;
|
||||
fs_m_out.RES_MODE = rip->i_mode;
|
||||
fs_m_out.RES_FILE_SIZE = rip->i_size;
|
||||
fs_m_out.RES_SYMLOOP = symlinks;
|
||||
fs_m_out.RES_UID = rip->i_uid;
|
||||
fs_m_out.RES_GID = rip->i_gid;
|
||||
fs_m_out.m_fs_vfs_lookup.inode = rip->i_num;
|
||||
fs_m_out.m_fs_vfs_lookup.mode = rip->i_mode;
|
||||
fs_m_out.m_fs_vfs_lookup.file_size = rip->i_size;
|
||||
fs_m_out.m_fs_vfs_lookup.symloop = symlinks;
|
||||
fs_m_out.m_fs_vfs_lookup.uid = rip->i_uid;
|
||||
fs_m_out.m_fs_vfs_lookup.gid = rip->i_gid;
|
||||
|
||||
/* This is only valid for block and character specials. But it doesn't
|
||||
* cause any harm to set RES_DEV always. */
|
||||
fs_m_out.RES_DEV = (dev_t) rip->i_zone[0];
|
||||
* cause any harm to always set the device field. */
|
||||
fs_m_out.m_fs_vfs_lookup.device = (dev_t) rip->i_zone[0];
|
||||
|
||||
if(r == EENTERMOUNT) {
|
||||
fs_m_out.RES_OFFSET = offset;
|
||||
fs_m_out.m_fs_vfs_lookup.offset = offset;
|
||||
put_inode(rip); /* Only return a reference to the final object */
|
||||
}
|
||||
|
||||
|
||||
@@ -445,12 +445,12 @@ int req_lookup(
|
||||
flags = resolve->l_flags;
|
||||
len = strlen(resolve->l_path) + 1;
|
||||
|
||||
m.m_type = REQ_LOOKUP;
|
||||
m.REQ_GRANT = grant_id;
|
||||
m.REQ_PATH_LEN = len;
|
||||
m.REQ_PATH_SIZE = PATH_MAX + 1;
|
||||
m.REQ_DIR_INO = (pino_t) dir_ino;
|
||||
m.REQ_ROOT_INO = (pino_t) root_ino;
|
||||
m.m_type = REQ_LOOKUP;
|
||||
m.m_vfs_fs_lookup.grant_path = grant_id;
|
||||
m.m_vfs_fs_lookup.path_len = len;
|
||||
m.m_vfs_fs_lookup.path_size = PATH_MAX + 1;
|
||||
m.m_vfs_fs_lookup.dir_ino = dir_ino;
|
||||
m.m_vfs_fs_lookup.root_ino = root_ino;
|
||||
|
||||
if(rfp->fp_ngroups > 0) { /* Is the process member of multiple groups? */
|
||||
/* In that case the FS has to copy the uid/gid credentials */
|
||||
@@ -468,17 +468,17 @@ int req_lookup(
|
||||
if(grant_id2 == -1)
|
||||
panic("req_lookup: cpf_grant_direct failed");
|
||||
|
||||
m.REQ_GRANT2 = grant_id2;
|
||||
m.REQ_UCRED_SIZE= sizeof(credentials);
|
||||
m.m_vfs_fs_lookup.grant_ucred = grant_id2;
|
||||
m.m_vfs_fs_lookup.ucred_size = sizeof(credentials);
|
||||
flags |= PATH_GET_UCRED;
|
||||
} else {
|
||||
/* When there's only one gid, we can send it directly */
|
||||
m.REQ_UID = (pgid_t) uid;
|
||||
m.REQ_GID = (pgid_t) gid;
|
||||
m.m_vfs_fs_lookup.uid = uid;
|
||||
m.m_vfs_fs_lookup.gid = gid;
|
||||
flags &= ~PATH_GET_UCRED;
|
||||
}
|
||||
|
||||
m.REQ_FLAGS = flags;
|
||||
m.m_vfs_fs_lookup.flags = flags;
|
||||
|
||||
/* Send/rec request */
|
||||
r = fs_sendrec(fs_e, &m);
|
||||
@@ -490,25 +490,25 @@ int req_lookup(
|
||||
|
||||
switch (r) {
|
||||
case OK:
|
||||
res->inode_nr = (ino_t) m.RES_INODE_NR;
|
||||
res->fmode = (mode_t) m.RES_MODE;
|
||||
res->fsize = m.RES_FILE_SIZE;
|
||||
res->dev = m.RES_DEV;
|
||||
res->uid = (uid_t) m.RES_UID;
|
||||
res->gid = (gid_t) m.RES_GID;
|
||||
res->inode_nr = m.m_fs_vfs_lookup.inode;
|
||||
res->fmode = m.m_fs_vfs_lookup.mode;
|
||||
res->fsize = m.m_fs_vfs_lookup.file_size;
|
||||
res->dev = m.m_fs_vfs_lookup.device;
|
||||
res->uid = m.m_fs_vfs_lookup.uid;
|
||||
res->gid = m.m_fs_vfs_lookup.gid;
|
||||
break;
|
||||
case EENTERMOUNT:
|
||||
res->inode_nr = (ino_t) m.RES_INODE_NR;
|
||||
res->char_processed = m.RES_OFFSET;
|
||||
res->symloop = m.RES_SYMLOOP;
|
||||
res->inode_nr = m.m_fs_vfs_lookup.inode;
|
||||
res->char_processed = m.m_fs_vfs_lookup.offset;
|
||||
res->symloop = m.m_fs_vfs_lookup.symloop;
|
||||
break;
|
||||
case ELEAVEMOUNT:
|
||||
res->char_processed = m.RES_OFFSET;
|
||||
res->symloop = m.RES_SYMLOOP;
|
||||
res->char_processed = m.m_fs_vfs_lookup.offset;
|
||||
res->symloop = m.m_fs_vfs_lookup.symloop;
|
||||
break;
|
||||
case ESYMLINK:
|
||||
res->char_processed = m.RES_OFFSET;
|
||||
res->symloop = m.RES_SYMLOOP;
|
||||
res->char_processed = m.m_fs_vfs_lookup.offset;
|
||||
res->symloop = m.m_fs_vfs_lookup.symloop;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user