diff options
author | Jérôme Glisse <jglisse@redhat.com> | 2018-03-24 23:16:40 -0400 |
---|---|---|
committer | Jérôme Glisse <jglisse@redhat.com> | 2018-04-04 14:37:12 -0400 |
commit | 5b5475fe9b6f415d147eedbca691216a3158470c (patch) | |
tree | 171cb210eec066ccdcc45b9bd6b9bac65632096e | |
parent | c0b152b42b48b274ad101b788c9b4caabcdef080 (diff) |
fs/lustre: do not rely on page->mapping get it from the context
This patch remove most dereference of page->mapping and get the mapping
from the call context (either already available in the function or by
adding it to function arguments).
Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: linux-fsdevel@vger.kernel.org
Cc: Tejun Heo <tj@kernel.org>
Cc: Oleg Drokin <oleg.drokin@intel.com>
Cc: Andreas Dilger <andreas.dilger@intel.com>
Cc: James Simmons <jsimmons@infradead.org>
Cc: lustre-devel@lists.lustre.org
-rw-r--r-- | drivers/staging/lustre/lustre/include/lustre_patchless_compat.h | 3 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/dir.c | 4 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/llite_internal.h | 9 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/llite_lib.c | 11 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/rw.c | 2 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/rw26.c | 5 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/vvp_dev.c | 8 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/vvp_io.c | 4 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/vvp_page.c | 15 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/mdc/mdc_request.c | 13 |
10 files changed, 41 insertions, 33 deletions
diff --git a/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h b/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h index 15fe1cfe1487..cf39848ffabc 100644 --- a/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h +++ b/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h @@ -49,8 +49,7 @@ truncate_complete_page(struct address_space *mapping, struct page *page) return; if (PagePrivate(page)) - page->mapping->a_ops->invalidatepage(mapping, page, - 0, PAGE_SIZE); + mapping->a_ops->invalidatepage(mapping, page, 0, PAGE_SIZE); cancel_dirty_page(page); ClearPageMappedToDisk(page); diff --git a/drivers/staging/lustre/lustre/llite/dir.c b/drivers/staging/lustre/lustre/llite/dir.c index 99b0b77c75f5..1b6afde4a701 100644 --- a/drivers/staging/lustre/lustre/llite/dir.c +++ b/drivers/staging/lustre/lustre/llite/dir.c @@ -167,8 +167,8 @@ void ll_release_page(struct inode *inode, struct page *page, bool remove) if (remove) { lock_page(page); - if (likely(page->mapping)) - truncate_complete_page(page->mapping, page); + if (likely(!!page->mapping)) + truncate_complete_page(inode->i_mapping, page); unlock_page(page); } put_page(page); diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h index 5cc0e9308d3a..8754d1c7ca20 100644 --- a/drivers/staging/lustre/lustre/llite/llite_internal.h +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h @@ -814,7 +814,8 @@ int ll_flush_ctx(struct inode *inode); void ll_umount_begin(struct super_block *sb); int ll_remount_fs(struct super_block *sb, int *flags, char *data); int ll_show_options(struct seq_file *seq, struct dentry *dentry); -void ll_dirty_page_discard_warn(struct page *page, int ioret); +void ll_dirty_page_discard_warn(struct address_space *mapping, + struct page *page, int ioret); int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req, struct super_block *sb, struct lookup_intent *it); int ll_obd_statfs(struct inode *inode, void __user *arg); @@ -923,13 +924,13 @@ void policy_from_vma(union ldlm_policy_data *policy, struct vm_area_struct *vma, struct vm_area_struct *our_vma(struct mm_struct *mm, unsigned long addr, size_t count); -static inline void ll_invalidate_page(struct page *vmpage) +static inline void ll_invalidate_page(struct address_space *mapping, + struct page *vmpage) { - struct address_space *mapping = vmpage->mapping; loff_t offset = vmpage->index << PAGE_SHIFT; LASSERT(PageLocked(vmpage)); - if (!mapping) + if (!vmpage->mapping) return; /* diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index 6735a6f006d2..d0c87ee295ca 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -2436,24 +2436,25 @@ char *ll_get_fsname(struct super_block *sb, char *buf, int buflen) return buf; } -void ll_dirty_page_discard_warn(struct page *page, int ioret) +void ll_dirty_page_discard_warn(struct address_space *mapping, + struct page *page, int ioret) { char *buf, *path = NULL; struct dentry *dentry = NULL; - struct vvp_object *obj = cl_inode2vvp(page->mapping->host); + struct vvp_object *obj = cl_inode2vvp(mapping->host); /* this can be called inside spin lock so use GFP_ATOMIC. */ buf = (char *)__get_free_page(GFP_ATOMIC); if (buf) { - dentry = d_find_alias(page->mapping->host); + dentry = d_find_alias(mapping->host); if (dentry) path = dentry_path_raw(dentry, buf, PAGE_SIZE); } CDEBUG(D_WARNING, "%s: dirty page discard: %s/fid: " DFID "/%s may get corrupted (rc %d)\n", - ll_get_fsname(page->mapping->host->i_sb, NULL, 0), - s2lsi(page->mapping->host->i_sb)->lsi_lmd->lmd_dev, + ll_get_fsname(mapping->host->i_sb, NULL, 0), + s2lsi(mapping->host->i_sb)->lsi_lmd->lmd_dev, PFID(&obj->vob_header.coh_lu.loh_fid), (path && !IS_ERR(path)) ? path : "", ioret); diff --git a/drivers/staging/lustre/lustre/llite/rw.c b/drivers/staging/lustre/lustre/llite/rw.c index ffd901cac652..a4eba3878400 100644 --- a/drivers/staging/lustre/lustre/llite/rw.c +++ b/drivers/staging/lustre/lustre/llite/rw.c @@ -903,7 +903,7 @@ out_unlock: int ll_writepage(struct address_space *mapping, struct page *vmpage, struct writeback_control *wbc) { - struct inode *inode = vmpage->mapping->host; + struct inode *inode = mapping->host; struct ll_inode_info *lli = ll_i2info(inode); struct lu_env *env; struct cl_io *io; diff --git a/drivers/staging/lustre/lustre/llite/rw26.c b/drivers/staging/lustre/lustre/llite/rw26.c index 19636e84192e..366ba0afbd0e 100644 --- a/drivers/staging/lustre/lustre/llite/rw26.c +++ b/drivers/staging/lustre/lustre/llite/rw26.c @@ -86,7 +86,7 @@ static void ll_invalidatepage(struct address_space *mapping, /* See the comment in ll_releasepage() */ env = cl_env_percpu_get(); LASSERT(!IS_ERR(env)); - inode = vmpage->mapping->host; + inode = mapping->host; obj = ll_i2info(inode)->lli_clob; if (obj) { page = cl_vmpage_page(vmpage, obj); @@ -114,8 +114,7 @@ static int ll_releasepage(struct address_space *mapping, if (PageWriteback(vmpage) || PageDirty(vmpage)) return 0; - mapping = vmpage->mapping; - if (!mapping) + if (!vmpage->mapping) return 1; obj = ll_i2info(mapping->host)->lli_clob; diff --git a/drivers/staging/lustre/lustre/llite/vvp_dev.c b/drivers/staging/lustre/lustre/llite/vvp_dev.c index 987c03b058e6..bffd2dbde90f 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_dev.c +++ b/drivers/staging/lustre/lustre/llite/vvp_dev.c @@ -502,6 +502,7 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, } while (0) static void vvp_pgcache_page_show(const struct lu_env *env, + struct address_space *mapping, struct seq_file *seq, struct cl_page *page) { struct vvp_page *vpg; @@ -516,8 +517,8 @@ static void vvp_pgcache_page_show(const struct lu_env *env, "none", vpg->vpg_defer_uptodate ? "du" : "- ", PageWriteback(vmpage) ? "wb" : "-", - vmpage, PFID(ll_inode2fid(vmpage->mapping->host)), - vmpage->mapping->host, vmpage->index, + vmpage, PFID(ll_inode2fid(mapping->host)), + mapping->host, vmpage->index, page_count(vmpage)); has_flags = 0; seq_page_flag(seq, vmpage, locked, has_flags); @@ -563,7 +564,8 @@ static int vvp_pgcache_show(struct seq_file *f, void *v) seq_printf(f, "%8x@" DFID ": ", id.vpi_index, PFID(lu_object_fid(&clob->co_lu))); if (page) { - vvp_pgcache_page_show(env, f, page); + vvp_pgcache_page_show(env, inode->i_mapping, + f, page); cl_page_put(env, page); } else { seq_puts(f, "missing\n"); diff --git a/drivers/staging/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c index e7a4778e02e4..aaa06ba38b4c 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_io.c +++ b/drivers/staging/lustre/lustre/llite/vvp_io.c @@ -1098,7 +1098,7 @@ static int vvp_io_fault_start(const struct lu_env *env, LASSERT(PageLocked(vmpage)); if (OBD_FAIL_CHECK(OBD_FAIL_LLITE_FAULT_TRUNC_RACE)) - ll_invalidate_page(vmpage); + ll_invalidate_page(inode->i_mapping, vmpage); size = i_size_read(inode); /* Though we have already held a cl_lock upon this page, but @@ -1127,7 +1127,7 @@ static int vvp_io_fault_start(const struct lu_env *env, if (last_index < fio->ft_index) { CDEBUG(D_PAGE, "llite: mkwrite and truncate race happened: %p: 0x%lx 0x%lx\n", - vmpage->mapping, fio->ft_index, last_index); + inode->i_mapping, fio->ft_index, last_index); /* * We need to return if we are * passed the end of the file. This will propagate diff --git a/drivers/staging/lustre/lustre/llite/vvp_page.c b/drivers/staging/lustre/lustre/llite/vvp_page.c index 6eb0565ddc22..27f58069a1a3 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_page.c +++ b/drivers/staging/lustre/lustre/llite/vvp_page.c @@ -138,6 +138,9 @@ static void vvp_page_discard(const struct lu_env *env, const struct cl_page_slice *slice, struct cl_io *unused) { + struct cl_object *obj = slice->cpl_obj; + struct inode *inode = vvp_object_inode(obj); + struct address_space *mapping = inode->i_mapping; struct page *vmpage = cl2vm_page(slice); struct vvp_page *vpg = cl2vvp_page(slice); @@ -145,23 +148,24 @@ static void vvp_page_discard(const struct lu_env *env, LASSERT(PageLocked(vmpage)); if (vpg->vpg_defer_uptodate && !vpg->vpg_ra_used) - ll_ra_stats_inc(vmpage->mapping->host, RA_STAT_DISCARDED); + ll_ra_stats_inc(mapping->host, RA_STAT_DISCARDED); - ll_invalidate_page(vmpage); + ll_invalidate_page(mapping, vmpage); } static void vvp_page_delete(const struct lu_env *env, const struct cl_page_slice *slice) { struct page *vmpage = cl2vm_page(slice); - struct inode *inode = vmpage->mapping->host; struct cl_object *obj = slice->cpl_obj; + struct inode *inode = vvp_object_inode(obj); + struct address_space *mapping = inode->i_mapping; struct cl_page *page = slice->cpl_page; int refc; LASSERT(PageLocked(vmpage)); LASSERT((struct cl_page *)vmpage->private == page); - LASSERT(inode == vvp_object_inode(obj)); + LASSERT(vmpage->mapping == mapping); /* Drop the reference count held in vvp_page_init */ refc = atomic_dec_return(&page->cp_ref); @@ -243,7 +247,8 @@ static void vvp_vmpage_error(struct inode *inode, struct page *vmpage, if ((ioret == -ESHUTDOWN || ioret == -EINTR) && obj->vob_discard_page_warned == 0) { obj->vob_discard_page_warned = 1; - ll_dirty_page_discard_warn(vmpage, ioret); + ll_dirty_page_discard_warn(inode->i_mapping, + vmpage, ioret); } } } diff --git a/drivers/staging/lustre/lustre/mdc/mdc_request.c b/drivers/staging/lustre/lustre/mdc/mdc_request.c index 4814ef083824..15060fa67025 100644 --- a/drivers/staging/lustre/lustre/mdc/mdc_request.c +++ b/drivers/staging/lustre/lustre/mdc/mdc_request.c @@ -914,12 +914,13 @@ restart_bulk: return 0; } -static void mdc_release_page(struct page *page, int remove) +static void mdc_release_page(struct address_space *mapping, struct page *page, + int remove) { if (remove) { lock_page(page); - if (likely(page->mapping)) - truncate_complete_page(page->mapping, page); + if (likely(!!page->mapping)) + truncate_complete_page(mapping, page); unlock_page(page); } put_page(page); @@ -973,7 +974,7 @@ static struct page *mdc_page_locate(struct address_space *mapping, __u64 *hash, offset, *start, *end, *hash); if (*hash > *end) { kunmap(page); - mdc_release_page(page, 0); + mdc_release_page(mapping, page, 0); page = NULL; } else if (*end != *start && *hash == *end) { /* @@ -983,7 +984,7 @@ static struct page *mdc_page_locate(struct address_space *mapping, __u64 *hash, * fetch the page we want. */ kunmap(page); - mdc_release_page(page, + mdc_release_page(mapping, page, le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE); page = NULL; } @@ -1357,7 +1358,7 @@ out_unlock: return rc; fail: kunmap(page); - mdc_release_page(page, 1); + mdc_release_page(mapping, page, 1); rc = -EIO; goto out_unlock; } |