[Ocfs2-devel] [PATCH] ocfs2: the parent directory reference count should be increased only after the ocfs2_add_entry function is successfully called

wangjian wangjian161 at huawei.com
Mon Mar 16 00:27:25 PDT 2020


good suggestion. Can we just move the three statements 
ocfs2_add_links_count (dirfe, 1),
ocfs2_journal_dirty (handle, parent_fe_bh), inc_nlink (dir) to the 
following?
This seems to be no problem. Or reset the reference count back in case 
of failure?

Thanks,
Jian

On 3/16/2020 12:46 PM, Joseph Qi wrote:
>
> On 2020/3/16 00:59, wangjian wrote:
>> Under some conditions, the directory cannot be deleted.
>> The specific scenarios are as follows: (for example,
>> /mnt/ocfs2 is the mount point)
>>
>> 1. Create the /mnt/ocfs2/p_dir directory. At this time,
>> the i_nlink corresponding to the inode of
>> the /mnt/ocfs2/p_dir directory is equal to 2.
>>
>> 2. During the process of creating the
>> /mnt/ocfs2/p_dir/s_dir directory, if the call to the inc_nlink
>> function in ocfs2_mknod succeeds, the functions such as
>> ocfs2_init_acl, ocfs2_init_security_set, and ocfs2_dentry_attach_lock fail.
>> At this time, the i_nlink corresponding to the inode of the
>> /mnt/ocfs2/p_dir directory is equal to 3, but /mnt/ocfs2/p_dir/s_dir
>> is not added to the /mnt/ocfs2/p_dir directory entry.
>>
>> 3. Delete the /mnt/ocfs2/p_dir directory (rm -rf /mnt/ocfs2/p_dir).
>> At this time, it is found that the i_nlink corresponding to
>> the inode corresponding to the /mnt/ocfs2/p_dir directory is equal to 3.
>> Therefore, the /mnt/ocfs2/p_dir directory cannot be deleted.
>>
>> Signed-off-by: Jian wang <wangjian161 at huawei.com>
>> ---
>>   ocfs2/namei.c | 24 +++++++++++++-----------
>>   1 file changed, 13 insertions(+), 11 deletions(-)
>>
>> diff --git a/ocfs2/namei.c b/ocfs2/namei.c
>> index 8ea51cf..19543b4 100644
>> --- a/ocfs2/namei.c
>> +++ b/ocfs2/namei.c
>> @@ -388,17 +388,6 @@ static int ocfs2_mknod(struct inode *dir,
>>               mlog_errno(status);
>>               goto leave;
>>           }
>> -
>> -        status = ocfs2_journal_access_di(handle, INODE_CACHE(dir),
>> -                         parent_fe_bh,
>> -                         OCFS2_JOURNAL_ACCESS_WRITE);
>> -        if (status < 0) {
>> -            mlog_errno(status);
>> -            goto leave;
>> -        }
> We can't simply move it down since we should get journal access before
> modification.
>
> Thanks,
> Joseph
>
>> -        ocfs2_add_links_count(dirfe, 1);
>> -        ocfs2_journal_dirty(handle, parent_fe_bh);
>> -        inc_nlink(dir);
>>       }
>>   
>>       status = ocfs2_init_acl(handle, inode, dir, new_fe_bh, parent_fe_bh,
>> @@ -440,6 +429,19 @@ static int ocfs2_mknod(struct inode *dir,
>>           goto leave;
>>       }
>>   
>> +    if (S_ISDIR(mode)) {
>> +        status = ocfs2_journal_access_di(handle, INODE_CACHE(dir),
>> +                         parent_fe_bh,
>> +                         OCFS2_JOURNAL_ACCESS_WRITE);
>> +        if (status < 0) {
>> +            mlog_errno(status);
>> +            goto leave;
>> +        }
>> +        ocfs2_add_links_count(dirfe, 1);
>> +        ocfs2_journal_dirty(handle, parent_fe_bh);
>> +        inc_nlink(dir);
>> +    }
>> +
>>       insert_inode_hash(inode);
>>       d_instantiate(dentry, inode);
>>       status = 0;
> .
>


More information about the Ocfs2-devel mailing list