Re: Using submit_bh from IOCTL

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Prasad,

On Tue, Jul 21, 2009 at 12:14 PM, Prasad Joshi <prasadjoshi124@xxxxxxxxx> wrote:
Hi All,

I am working on a block device (something similar to the loop device). The block device is associated with a file. So every write or read on block device is intern scheduled to the backing file. Very much similar to the loop device.

But, I also need to submit a page full of IOs from the kernel mode. For time being, to make sure it works correctly, I wrote an IOCTL which will create a page, attach buffer heads with it and then call submit_bh(write, bh); to schedule a request to the block device.

This is a part of the code

int iftl_ioctl (struct block_device *bdev, fmode_t mode, unsigned cmd,
    unsigned long arg)
{
    struct iftl_device *dev = bdev->bd_disk->private_data;
    struct buffer_head *bh = NULL, *head = NULL;
    struct file *file = NULL;
    int error = 0;

....
....

    case IFTL_WRITEBLOCK:
        if (!page) {
            page = alloc_page(GFP_KERNEL);
            if (!page) {
                page = ERR_PTR(-ENOMEM);
            }
            if (IS_ERR(page)) {
                goto ERROR;
            }
        }

        if (!page_has_buffers(page)) {
            create_empty_buffers(page, PAGE_SIZE, 0);
        }

        bh = head = page_buffers(page);
        fill_data(page);

        bh->b_blocknr = 0;
        bh->b_bdev = dev->bdev;
        bh->b_end_io = end_page_write;

        set_buffer_locked(bh);
        set_buffer_mapped(bh);

//      mark_buffer_dirty(bh);

        submit_bh(WRITE, bh);
        break;
    default:
        error = -EINVAL;
        goto ERROR;
    }
ERROR:
    return error;
}

But the code fails in generic_make_request() that is called from the submit_bh(). Can someone help?

What exactly does fails or whats the error code that is being returned.
I suspect playing with some data members of bh. But if you provide the exact error ( console logs + dmesg ), it will really be helpful.

 

As the page that I have allocated is not attached with an address_space (mapping) could it be reason for the failure?
Do every page used in disk IO needs an associated mapping?

IMO, No.
 

Thanks and Regards,
Prasad


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux