How to safely access inode/dentry obtained from struct page *?

Rohan Puri rohan.puri15 at gmail.com
Wed Sep 3 16:03:52 EDT 2014


On Wed, Sep 3, 2014 at 10:50 PM, Joshi <joshiiitr at gmail.com> wrote:
>
> Thanks Pranay. Please see below-
>
> On Mon, Sep 1, 2014 at 10:19 AM, Pranay Srivastava <pranjas at gmail.com> wrote:
> >
> > On 01-Sep-2014 10:18 AM, "Pranay Srivastava" <pranjas at gmail.com> wrote:
> >>
> >>
> >> On 30-Aug-2014 10:49 AM, "Joshi" <joshiiitr at gmail.com> wrote:
> >> >
> >> > I am trying to obtain file name at block layer level (above IO
> >> > scheduler).
> >> > At this level I receive bio structure, within which page pointers are
> >> > kept.
> >> >
> >> > Thereby I do following to obtain the inode and dentry -
> >> >
> >> > struct inode *inode_ptr = page->mapping->host;
> >> > if (inode_ptr != NULL)
> >> > /* Access dentry i.e. i_dentry in the inode */
> >> >
> >>
> >> Are you doing this in readpage(s) or writepage(s) callback? If that's the
> >> case your page would be locked and dentry/inode wouldn't go away.
> >>
> >> If you are doing something else then first make sure you do lock_page and
> >> proceed only if you get that page lock.
>
> I am not operating at file-system level. I am operating on the bio
> that file-system(or any other component above IO scheduler) might have
> sent.
> Do you think that page descriptor kept in bio (for write) is going to
> vanish? I am not accessing the data of the page, just the
> page->mapping pointer.

Yes, it can happen. Race condition for your case can happen either due
to page mapping removed or dentry removed from cache.Cases that I can
think of are invalidations/truncation of page mapping happening
(truncate, file delete, file hole punching) & as default IO is async
so dentry can be evicted due to load as in fsstress by the time you
print filename.

>
>
> >> Second you can try dget and dput before you start working with dentry.
>
> I will try that.
>
> >> > This works usually. But problem is, inode and dentry may get released
> >> > from inode and dentry cache at any time.
> >> > While accessing inode/dentry I need to ensure that till the time I am
> >> > accessing'em these structure remain valid in memory.
> >> > Is it possible to ensure that? Which structures/locks I need to check
> >> > for the purpose.
> >>
> >> is this your observation from your test case? Can you explain your test
> >> case a bit.
>
> No, normally I obtain file name. But with fsstress, this causes crash.
>
> >>
> > Have you seen d_alias and see if that can help you with filename?
>
> I do get filename from dentry. But while I am accessing that, it can
> be freed by vfs.
>
> >
> >> >
> >> > Appreciate any help.
> >> >
> >> > Thanks!
> >> >
> >> > --
> >> > Joshi
> >> >
> >> > _______________________________________________
> >> > Kernelnewbies mailing list
> >> > Kernelnewbies at kernelnewbies.org
> >> > http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
>
>
> --
> Joshi
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Make use of proper synchronization stuff as Pranay pointed out. Btw,
what is the use case you need this for ? (just curious to know)

- Rohan



More information about the Kernelnewbies mailing list