[Ocfs2-devel] [RFC][PATCH 4/4] configfs: Make multiple default_group destructions lockdep friendly
Louis Rilling
Louis.Rilling at kerlabs.com
Fri May 23 09:44:58 PDT 2008
Louis Rilling a écrit :
> When destroying a config_group having multiple (nested or not) default groups,
> lockdep raises a warning because multiple locks of class I_MUTEX_NORMAL are
> taken in configfs_detach_prep().
>
> This patch makes such default group destructions lockdep-friendly by increasing
> the i_mutex sub-class from I_MUTEX_CHILD + 1 onwards for each default group
> locked under a being-destroyed config_group.
I discovered two bugs, as described below, and fixed in the attached
version of the patch. Sorry for the noise.
[...]
>
> Index: b/fs/configfs/dir.c
> ===================================================================
> --- a/fs/configfs/dir.c 2008-05-22 12:38:02.000000000 +0200
> +++ b/fs/configfs/dir.c 2008-05-22 12:49:08.000000000 +0200
[...]
> @@ -383,7 +395,15 @@ static int configfs_detach_prep(struct d
> if (sd->s_type & CONFIGFS_NOT_PINNED)
> continue;
> if (sd->s_type & CONFIGFS_USET_DEFAULT) {
> - mutex_lock(&sd->s_dentry->d_inode->i_mutex);
> + lock_level = set_dirent_lock_level(parent_sd, sd);
> + if (lock_level < 0) {
> + /* Bad bad bad! We cannot remove a directory
> + * that we let be created! */
> + ret = -ELOOP;
> + break;
> + }
> + mutex_lock_nested(&sd->s_dentry->d_inode->i_mutex,
> + I_MUTEX_CHILD + lock_level);
> /* Mark that we've taken i_mutex */
> sd->s_type |= CONFIGFS_USET_DROPPING;
>
Here setting lock_level before acquiring the mutex may race with mkdir
(and thus configfs_attach_group()) in the default group. A corrected
version of the patch is attached.
[...]
> @@ -1206,7 +1230,11 @@ static int configfs_rmdir(struct inode *
> return -EINVAL;
> }
>
> + /* The inode of the config_item being removed is already locked by
> + * vfs_rmdir() with subclass I_MUTEX_CHILD. Account for it. */
> + set_dirent_lock_level(parent_item->ci_dentry->d_fsdata, sd);
> ret = configfs_detach_prep(dentry);
> + reset_dirent_lock_level(sd);
> if (ret) {
> configfs_detach_rollback(dentry);
> config_item_put(parent_item);
lock_level should be reset on rollback, since mkdir may be called again
after a failure of rmdir. Again, fixed in the new version of the patch
in attachment.
Louis
--
Dr Louis Rilling Kerlabs
Skype: louis.rilling Batiment Germanium
Phone: (+33|0) 6 80 89 08 23 80 avenue des Buttes de Coesmes
http://www.kerlabs.com/ 35700 Rennes
-------------- next part --------------
A non-text attachment was scrubbed...
Name: configfs-make-default-group-destruction-lockdep-friendly-2.patch
Type: text/x-diff
Size: 7137 bytes
Desc: not available
Url : http://oss.oracle.com/pipermail/ocfs2-devel/attachments/20080523/53738fb6/attachment.bin
More information about the Ocfs2-devel
mailing list