On Fri, Mar 08, 2013 at 05:07:23PM +0530, Satyajit Paul wrote:
> Hello,
> 
> When I wanted to change the state of DRBD from primary to secondary, 
> sometimes I get the "Device is held open by someone" issue.
> I looked into the code drbd_main.c (DRBD Release 8.0.11) and found that the 
> error is set from the below code.
> 
>     else if( ns.role == Secondary && mdev->open_cnt )
>         rv=SS_DeviceInUse;
> 
> I put debug logs and found that sometimes "open_cnt" variable is not
> equal to zero that results in the error. "open_cnt" variable is
> incremented and decremented from the function drbd_open() and
> drbd_close() respectively. In function drbd_open(), "open_cnt"
> variable is handled within locking/unlocking function to avoid race
> condition whereas in drbd_close(), no such locking/unlocking function
> is there to handle its critical section. Can we imagine any scenario
> that due to the absence of locking/unlocking function in the
> drbd_close() function, race condition is occurring that results in the
> wrong value of "open_cnt" variable.

Very unlikely, as last time I checked,
it is serialized higher up in the stack (in i_mutex possibly?).

The lock is there to avoid races between looking/changing state.

See also:
http://www.gossamer-threads.com/lists/drbd/users/17007?do=post_view_threaded
This has come up so many times, really...

and if all else fails, and you really did not overlook some
devicemapper or other user,
I maintain it is *udev* *udev* *udev*, some short lived blkid or other
funky thing that looks at the device right when you want to demote it..

But feel free to change that to an atomic_t, if you think it helps.

-- 
: Lars Ellenberg
: LINBIT | Your Way to High Availability
: DRBD/HA support and consulting http://www.linbit.com

DRBD® and LINBIT® are registered trademarks of LINBIT, Austria.
_______________________________________________
drbd-user mailing list
[email protected]
http://lists.linbit.com/mailman/listinfo/drbd-user

Reply via email to