Hi, On Sun, Jun 17, 2007 at 11:38:55AM +0200, Bjoern Steinbrink wrote: [SNIP] > > - /* first decide result */ > > - if (bdev->bd_holder == holder) > > - res = 0; /* already a holder */ > > - else if (bdev->bd_holder != NULL) > > - res = -EBUSY; /* held by someone else */ > > - else if (bdev->bd_contains == bdev) > > - res = 0; /* is a whole device which isn't held */ > > - > > - else if (bdev->bd_contains->bd_holder == bd_claim) > > - res = 0; /* is a partition of a device that is being partitioned */ > > - else if (bdev->bd_contains->bd_holder != NULL) > > - res = -EBUSY; /* is a partition of a held device */ > > - else > > - res = 0; /* is a partition of an un-held device */ > > + /* If already held by someone else or we have a > > + * partition of a held device, we do nothing. */ > > > > - /* now impose change */ > > - if (res==0) { > > + if (bdev->bd_holder || bdev->bd_contains->bd_holder) > > + res = -EBUSY; [SNAP] > Hm, that actually ignores the "someone else" part of the comment and > introduces a semantic change. No idea, if it breaks anything though. Whoops, yes. ->bd_holder can be actually !NULL when it is == holder. Same for ->bd_contains->bd_holder. Also the `is a whole unheld device' was ignored - sorry. Second try: This patch replaces some obscure code-paths in fs/block_dev.c with more readable versions. Signed-off-by: Johannes Weiner