On 3/8/06, Ali Ahmed Thawerani <[email protected]> wrote:
> i have written a wrapper for a block device. my wrapper is also
> registered as a block device and i am obtaining the pointer bdev of
> the wrapper block device by using the open_by_devnum function with
> FMODE_READ | FMODE_WRITE
>
> i want to sync the memory pages that are in the page cache for this
> particular wrapper block device
>
> what i am doing is using two functions filemap_fdatawrite and
> filemap_fdatawait which take bdev->bd_inode->i_mapping as argument and
> sync the data associated with a particular block device
>
> the return status of these two functions is 0 which i think means no success
>
> i have tried to figure out what can be the reason for this and i
> followed the function calling that have been made
>
> some of the possible reasons were: when
> i_mapping->backing_dev_info->memory_backed is 1 then these functions
> return 0 i have checked that this value is not greater than 0 moreover
> i have also checked that the i_mapping->nr_pages are also greater than
> 0
>
> i was not able to go any further
>
> i am calling these two functions in a thread
>
> there was also another problem that when there is some request coming
> to my wrapper block device and wake up the thread which tries to sync
> the page cache my system gets stuck may be both the threads are trying
> to modify the inodes at the same time and none is succeeding
>
> what i did to solve this problem that i used kernel timer if there is
> no request in the request queue for jiffies + 30 then i wake up the
> thread to sync the buffer cache and at the same time set a
> flag........ as according to my assumption when buffer cache will sync
> data will come to my wrapper block device and i have to requeue it to
> avoid any sort of problem but the thing is no such thing happens that
> is there is no new request in request queue at all
>
> can any one help me out in this
>
i want to add a few more things that i have tried
i looked at the function filemap_fdatawrite and followed the function
calling at got to do_writepages which was in turn calling either the
i_mapping->a_ops->writepages or generic_writepages with the parameters
mapping and wbc
i copied do_writepages as it is in my code and gave i_mapping in place
of mapping and defined a structure of struct writeback_control with
syncmode = WB_SYNC_ALL, start = 0, end = 0, nr_to_write =
i_mapping->nr_pages * 2 and non_blocking = 1 the values of start and
end are given 0 in __filemap_fdatawrite and syncmode = WB_SYNC_ALL is
given in filemap_fdatawrite so i just gave the same values
i have seen that i_mapping->a_ops->writepages is assigned
generic_writepages and generic_writepages calls mpage_writepages
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]