This is my first post, so please tell me if this isn't the right sort of
thing to post here.

I think there is a race in iput() if inode->i_op->put_inode ==
force_delete()...

void iput(struct inode *inode)
{
        if (inode) {
                struct super_operations *op = NULL;

                if (inode->i_sb && inode->i_sb->s_op)
                        op = inode->i_sb->s_op;
                if (op && op->put_inode)
                        op->put_inode(inode);
//========>
                if (!atomic_dec_and_lock(&inode->i_count, &inode_lock))
                        return;

                if (!inode->i_nlink) {
                        list_del(&inode->i_hash);
                        INIT_LIST_HEAD(&inode->i_hash);


If force_delete() resets i_nlink to 0, somone else could iget4() the inode
just before the atomic_dec_and_lock().

--

                Cheers,
                        Eric

----------------------------------------------------
|Eric Barton        Barton Software                |
|9 York Gardens     Tel:    +44 (117) 923 9831     |
|Clifton            Mobile: +44 (7909) 680 356     |
|Bristol BS8 4LL    Fax:    call first             |
|United Kingdom     E-Mail: [EMAIL PROTECTED]|
----------------------------------------------------

-
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to [EMAIL PROTECTED]

Reply via email to