[dm-devel] Re: lvresize fails with "reload ioctl failed: Invalid argument"
Laurent Riffard
laurent.riffard at free.fr
Tue Sep 12 20:57:10 UTC 2006
Le 12.09.2006 02:19, Jun'ichi Nomura a écrit :
> Hi Laurent,
>
> Laurent Riffard wrote:
>>>>>>> device-mapper: reload ioctl failed: Invalid argument
> ...
>>> works for me with 2.6.17-4mdv kernel
>>> maybe something related to your kernel version?
>>
>> Yes, you seem to be right: it does work with 2.6.17-2mdv or
>> 2.6.17-4mdv, but it fails with 2.6.18-rc6-mm1.
>
> I reproduced the problem on my host, too.
> I found a change in -mm which would cause this problem
> and attached patch fixed it.
>
> I'll post it to linux-kernel as well.
>
> Thanks,
Hi Jun'ichi,
I can confirm that your patch solved this problem.
- 2.6.18-rc6 works
- 2.6.18-rc6-mm1 fails
- 2.6.18-rc6-mm2 fails
- 2.6.18-rc6-mm2 + correct-add_bd_holder-return-value.patch works
Thanks!
--
laurent
> ------------------------------------------------------------------------
>
> If a matching bd_holder is found in bd_holder_list,
> add_bd_holder() completes its job by just incrementing the reference count.
> In this case, it should be considered as success but it used to return 'fail'
> to let the caller free bd_holder.
> Fixed it to return success and free given object by itself.
>
> Also, if either one of symlinking fails, the bd_holder should not
> be added to the list so that it can be discarded later.
> Otherwise, the caller will free bd_holder which is in the list.
>
> This patch is neccessary only for -mm (later than 2.6.18-rc1-mm1).
>
> fs/block_dev.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> Signed-off-by: Jun'ichi Nomura <j-nomura at ce.jp.nec.com>
>
> diff -urp linux-2.6.18-rc5-mm1.orig/fs/block_dev.c linux-2.6.18-rc5-mm1/fs/block_dev.c
> --- linux-2.6.18-rc5-mm1.orig/fs/block_dev.c 2006-09-11 19:33:35.000000000 -0400
> +++ linux-2.6.18-rc5-mm1/fs/block_dev.c 2006-09-11 19:21:46.000000000 -0400
> @@ -655,8 +655,8 @@ static void free_bd_holder(struct bd_hol
> * If there is no matching entry with @bo in @bdev->bd_holder_list,
> * add @bo to the list, create symlinks.
> *
> - * Returns 0 if @bo was added to the list.
> - * Returns -ve if @bo wasn't used by any reason and should be freed.
> + * Returns 0 if symlinks are created or already there.
> + * Returns -ve if something fails and @bo can be freed.
> */
> static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo)
> {
> @@ -669,7 +669,9 @@ static int add_bd_holder(struct block_de
> list_for_each_entry(tmp, &bdev->bd_holder_list, list) {
> if (tmp->sdir == bo->sdir) {
> tmp->count++;
> - return -EEXIST;
> + /* We've already done what we need to do here. */
> + free_bd_holder(bo);
> + return 0;
> }
> }
>
> @@ -682,7 +684,8 @@ static int add_bd_holder(struct block_de
> if (ret)
> del_symlink(bo->sdir, bo->sdev);
> }
> - list_add_tail(&bo->list, &bdev->bd_holder_list);
> + if (ret == 0)
> + list_add_tail(&bo->list, &bdev->bd_holder_list);
> return ret;
> }
>
More information about the dm-devel
mailing list