Check for loops in parent inode chains

allow-etcd-address-option
Vitaliy Filippov 2021-06-20 00:23:03 +03:00
parent 6ca8afffe5
commit aad7792d3f
2 changed files with 12 additions and 4 deletions

View File

@ -695,13 +695,16 @@ resume_3:
// Check parent inode // Check parent inode
auto ino_it = st_cli.inode_config.find(op->cur_inode); auto ino_it = st_cli.inode_config.find(op->cur_inode);
while (ino_it != st_cli.inode_config.end() && ino_it->second.parent_id && while (ino_it != st_cli.inode_config.end() && ino_it->second.parent_id &&
INODE_POOL(ino_it->second.parent_id) == INODE_POOL(op->cur_inode)) INODE_POOL(ino_it->second.parent_id) == INODE_POOL(op->cur_inode) &&
// Check for loops
ino_it->second.parent_id != op->inode)
{ {
// Skip parents from the same pool // Skip parents from the same pool
ino_it = st_cli.inode_config.find(ino_it->second.parent_id); ino_it = st_cli.inode_config.find(ino_it->second.parent_id);
} }
if (ino_it != st_cli.inode_config.end() && if (ino_it != st_cli.inode_config.end() &&
ino_it->second.parent_id) ino_it->second.parent_id &&
ino_it->second.parent_id != op->inode)
{ {
// Continue reading from the parent inode // Continue reading from the parent inode
op->cur_inode = ino_it->second.parent_id; op->cur_inode = ino_it->second.parent_id;

View File

@ -67,7 +67,9 @@ bool osd_t::prepare_primary_rw(osd_op_t *cur_op)
} }
// Find parents from the same pool. Optimized reads only work within pools // Find parents from the same pool. Optimized reads only work within pools
while (inode_it != st_cli.inode_config.end() && inode_it->second.parent_id && while (inode_it != st_cli.inode_config.end() && inode_it->second.parent_id &&
INODE_POOL(inode_it->second.parent_id) == pg_it->second.pool_id) INODE_POOL(inode_it->second.parent_id) == pg_it->second.pool_id &&
// Check for loops
inode_it->second.parent_id != cur_op->req.rw.inode)
{ {
chain_size++; chain_size++;
inode_it = st_cli.inode_config.find(inode_it->second.parent_id); inode_it = st_cli.inode_config.find(inode_it->second.parent_id);
@ -123,7 +125,10 @@ bool osd_t::prepare_primary_rw(osd_op_t *cur_op)
int chain_num = 0; int chain_num = 0;
op_data->read_chain[chain_num++] = cur_op->req.rw.inode; op_data->read_chain[chain_num++] = cur_op->req.rw.inode;
auto inode_it = st_cli.inode_config.find(cur_op->req.rw.inode); auto inode_it = st_cli.inode_config.find(cur_op->req.rw.inode);
while (inode_it != st_cli.inode_config.end() && inode_it->second.parent_id) while (inode_it != st_cli.inode_config.end() && inode_it->second.parent_id &&
INODE_POOL(inode_it->second.parent_id) == pg_it->second.pool_id &&
// Check for loops
inode_it->second.parent_id != cur_op->req.rw.inode)
{ {
op_data->read_chain[chain_num++] = inode_it->second.parent_id; op_data->read_chain[chain_num++] = inode_it->second.parent_id;
inode_it = st_cli.inode_config.find(inode_it->second.parent_id); inode_it = st_cli.inode_config.find(inode_it->second.parent_id);