From 478831cf1792ed2f4d48dbe65558e55f61a9c62b Mon Sep 17 00:00:00 2001 From: hiramatu Date: Mon, 20 Aug 2007 18:25:14 +0000 Subject: 2007-08-20 Masami Hiramatsu * ioblock.stp: Fix __bio_ino() not to access i_ino if the page is not assigned to any inode. * stack-x86_64.c: Fix backtrace to use the value of stack register instead of its address. --- tapset/ioblock.stp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'tapset/ioblock.stp') diff --git a/tapset/ioblock.stp b/tapset/ioblock.stp index 761818fc..d2efd525 100644 --- a/tapset/ioblock.stp +++ b/tapset/ioblock.stp @@ -17,12 +17,17 @@ function __bio_ino:long(bio:long) %{ struct bio *bio = (struct bio *)(long)THIS->bio; struct page *bv_page = bio? kread(&(bio->bi_io_vec[0].bv_page)) : NULL; - struct address_space *mapping = bv_page? kread(&(bv_page->mapping)) : NULL; - struct inode *host = mapping? kread(&(mapping->host)) : NULL; - if (host == NULL) - THIS->__retvalue = -1; - else - THIS->__retvalue = kread(&(host->i_ino)); + struct address_space *mapping; + struct inode *host; + THIS->__retvalue = -1; + if (bv_page && !PageSlab(bv_page) && !PageSwapCache(bv_page)) { + mapping = kread(&(bv_page->mapping)); + if (mapping && ((unsigned long)mapping & PAGE_MAPPING_ANON) == 0) { + host = kread(&(mapping->host)); + if (host) + THIS->__retvalue = kread(&(host->i_ino)); + } + } CATCH_DEREF_FAULT(); %} -- cgit