Changeset a93d79a in mainline for uspace/srv/fs/fat/fat_ops.c


Ignore:
Timestamp:
2010-10-19T21:11:11Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8fb1bf82, e0e568ff
Parents:
f14291b
Message:

Do not hold the parent→idx→lock in when calling fat_idx_get_by_pos() as it
both is not necessary and violates the natural locking order used by
fat_idx_get_by_pos() and fat_idx_get_by_index().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/fat/fat_ops.c

    rf14291b ra93d79a  
    369369        unsigned blocks;
    370370        fat_dentry_t *d;
     371        dev_handle_t dev_handle;
    371372        block_t *b;
    372373        int rc;
    373374
    374375        fibril_mutex_lock(&parentp->idx->lock);
    375         bs = block_bb_get(parentp->idx->dev_handle);
     376        dev_handle = parentp->idx->dev_handle;
     377        fibril_mutex_unlock(&parentp->idx->lock);
     378
     379        bs = block_bb_get(dev_handle);
    376380        blocks = parentp->size / BPS(bs);
    377381        for (i = 0; i < blocks; i++) {
    378382                rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE);
    379                 if (rc != EOK) {
    380                         fibril_mutex_unlock(&parentp->idx->lock);
     383                if (rc != EOK)
    381384                        return rc;
    382                 }
    383385                for (j = 0; j < DPS(bs); j++) {
    384386                        d = ((fat_dentry_t *)b->data) + j;
     
    390392                                /* miss */
    391393                                rc = block_put(b);
    392                                 fibril_mutex_unlock(&parentp->idx->lock);
    393394                                *rfn = NULL;
    394395                                return rc;
     
    401402                                /* hit */
    402403                                fat_node_t *nodep;
    403                                 /*
    404                                  * Assume tree hierarchy for locking.  We
    405                                  * already have the parent and now we are going
    406                                  * to lock the child.  Never lock in the oposite
    407                                  * order.
    408                                  */
    409                                 fat_idx_t *idx = fat_idx_get_by_pos(
    410                                     parentp->idx->dev_handle, parentp->firstc,
    411                                     i * DPS(bs) + j);
    412                                 fibril_mutex_unlock(&parentp->idx->lock);
     404                                fat_idx_t *idx = fat_idx_get_by_pos(dev_handle,
     405                                    parentp->firstc, i * DPS(bs) + j);
    413406                                if (!idx) {
    414407                                        /*
     
    433426                }
    434427                rc = block_put(b);
    435                 if (rc != EOK) {
    436                         fibril_mutex_unlock(&parentp->idx->lock);
     428                if (rc != EOK)
    437429                        return rc;
    438                 }
    439         }
    440 
    441         fibril_mutex_unlock(&parentp->idx->lock);
     430        }
     431
    442432        *rfn = NULL;
    443433        return EOK;
Note: See TracChangeset for help on using the changeset viewer.