Re: [NBD] Use per-device semaphore instead of BKL

From: Paul Clements
Date: Sun Nov 20 2005 - 12:19:25 EST

Herbert Xu wrote:
On Sun, Nov 20, 2005 at 09:34:19AM +1100, herbert wrote:

This is intentional actually. nbd_clear_queue never races against
nbd_find_request because the ioctl is protected by the BKL. If it
weren't, then we have much worse problems to worry about (e.g.,
while you're clearing the queue someone else could have set the
socket again and started queueing requests).

Actually, we do have bigger problems :) The BKL is dropped every
time you sleep, and nbd_do_it is definitely a frequent sleeper :)

The dropping of the lock in nbd_do_it is actually critical to the way nbd functions. nbd_do_it runs for the lifetime of the nbd device, so if nbd_do_it were holding some lock (BKL or otherwise), we'd have big problems.

This isn't really an issue in practice though because the NBD
client program is single-threaded and doesn't share its file
descriptors with anyone else.

Right, there's no problem in practice.

However, we shouldn't make it too easy for the user to shoot himself
in the foot. If he's going to do that, let him at least pay for the
bullet :)

So here is a patch to use a per-device semaphore instead of the
BKL to protect the ioctl's against each other.

The problem with this patch is that no ioctls can come in once nbd_do_it starts because nbd_do_it runs for the lifetime of the device.

I think we really just need to add the acquiring of queue_lock in nbd_clear_que to your previous patch and leave it at that. I'll code that up and test it.

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at