Hi,

I was going through this code below and was confused why do we need
lock ordering here. What is the problem that it is trying to prevent
given that the corresponding unlocking doesn't care for the order. I
assume lock orders are primarily needed to avoid deadlocks, and if
they are then they need to be unlocked in the same order too.

File : fs/ext4/move_extent.c

/**
 * mext_double_down_write - Acquire two inodes' write semaphore
 *
 * @orig_inode:         original inode structure
 * @donor_inode:        donor inode structure
 * Acquire write semaphore of the two inodes (orig and donor) by i_ino order.
 */
static void
mext_double_down_write(struct inode *orig_inode, struct inode *donor_inode)
{
        struct inode *first = orig_inode, *second = donor_inode;

        BUG_ON(orig_inode == NULL || donor_inode == NULL);

        /*
         * Use the inode number to provide the stable locking order instead
         * of its address, because the C language doesn't guarantee you can
         * compare pointers that don't come from the same array.
         */
        if (donor_inode->i_ino < orig_inode->i_ino) {
                first = donor_inode;
                second = orig_inode;
        }

        down_write(&EXT4_I(first)->i_data_sem);
        down_write(&EXT4_I(second)->i_data_sem);
}

/**
 * mext_double_up_read - Release two inodes' read semaphore
 *
 * @orig_inode:         original inode structure to be released its lock first
 * @donor_inode:        donor inode structure to be released its lock second
 * Release read semaphore of two inodes (orig and donor).
 */
static void
mext_double_up_read(struct inode *orig_inode, struct inode *donor_inode)
{
        BUG_ON(orig_inode == NULL || donor_inode == NULL);

        up_read(&EXT4_I(orig_inode)->i_data_sem);
        up_read(&EXT4_I(donor_inode)->i_data_sem);
}


-- 
Thanks -
Manish

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to