summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérôme Glisse <jglisse@redhat.com>2018-03-24 23:16:40 -0400
committerJérôme Glisse <jglisse@redhat.com>2018-04-04 14:37:12 -0400
commit5b5475fe9b6f415d147eedbca691216a3158470c (patch)
tree171cb210eec066ccdcc45b9bd6b9bac65632096e
parentc0b152b42b48b274ad101b788c9b4caabcdef080 (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.h3
-rw-r--r--drivers/staging/lustre/lustre/llite/dir.c4
-rw-r--r--drivers/staging/lustre/lustre/llite/llite_internal.h9
-rw-r--r--drivers/staging/lustre/lustre/llite/llite_lib.c11
-rw-r--r--drivers/staging/lustre/lustre/llite/rw.c2
-rw-r--r--drivers/staging/lustre/lustre/llite/rw26.c5
-rw-r--r--drivers/staging/lustre/lustre/llite/vvp_dev.c8
-rw-r--r--drivers/staging/lustre/lustre/llite/vvp_io.c4
-rw-r--r--drivers/staging/lustre/lustre/llite/vvp_page.c15
-rw-r--r--drivers/staging/lustre/lustre/mdc/mdc_request.c13
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;
}