[lustre-devel] [PATCH 056/151] lustre: llite: check layout size after cl_object_layout_get
James Simmons
jsimmons at infradead.org
Mon Sep 30 11:55:15 PDT 2019
From: Mikhal Pershin <mpershin at whamcloud.com>
Check that layout size is not zero before doing flush for
DoM object. Also patch does that:
- initializes all values in cl_layout explicitly
in lov_object_layout_get().
- changes cl_dom_comp_size to u64 for future needs, e.g.
importing an existing filesystem image directly.
WC-bug-id: https://jira.whamcloud.com/browse/LU-3285
Lustre-commit: 877669a282ef ("LU-3285 llite: check layout size after cl_object_layout_get")
Signed-off-by: Mikhal Pershin <mpershin at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/29810
Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
fs/lustre/include/cl_object.h | 2 +-
fs/lustre/llite/namei.c | 3 +--
fs/lustre/lov/lov_object.c | 4 ++++
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/fs/lustre/include/cl_object.h b/fs/lustre/include/cl_object.h
index 0894b2e..c0d6452 100644
--- a/fs/lustre/include/cl_object.h
+++ b/fs/lustre/include/cl_object.h
@@ -287,7 +287,7 @@ struct cl_layout {
/** size of layout in lov_mds_md format. */
size_t cl_size;
/** size of DoM component if exists or zero otherwise */
- u32 cl_dom_comp_size;
+ u64 cl_dom_comp_size;
/** Layout generation. */
u32 cl_layout_gen;
/** whether layout is a composite one */
diff --git a/fs/lustre/llite/namei.c b/fs/lustre/llite/namei.c
index fb75441..355a500 100644
--- a/fs/lustre/llite/namei.c
+++ b/fs/lustre/llite/namei.c
@@ -197,10 +197,9 @@ int ll_dom_lock_cancel(struct inode *inode, struct ldlm_lock *lock)
CDEBUG(D_INODE, "Cannot get layout for "DFID"\n",
PFID(ll_inode2fid(inode)));
rc = -ENODATA;
- } else if (clt.cl_dom_comp_size == 0) {
+ } else if (clt.cl_size == 0 || clt.cl_dom_comp_size == 0) {
CDEBUG(D_INODE, "DOM lock without DOM layout for "DFID"\n",
PFID(ll_inode2fid(inode)));
- rc = -EINVAL;
} else {
enum cl_fsync_mode mode;
loff_t end = clt.cl_dom_comp_size - 1;
diff --git a/fs/lustre/lov/lov_object.c b/fs/lustre/lov/lov_object.c
index 9fcf51b..3a7b38d 100644
--- a/fs/lustre/lov/lov_object.c
+++ b/fs/lustre/lov/lov_object.c
@@ -1869,6 +1869,7 @@ static int lov_object_layout_get(const struct lu_env *env,
cl->cl_size = lov_comp_md_size(lsm);
cl->cl_layout_gen = lsm->lsm_layout_gen;
+ cl->cl_dom_comp_size = 0;
if (lsm_is_composite(lsm->lsm_magic)) {
struct lov_stripe_md_entry *lsme = lsm->lsm_entries[0];
@@ -1876,7 +1877,10 @@ static int lov_object_layout_get(const struct lu_env *env,
if (lsme_is_dom(lsme))
cl->cl_dom_comp_size = lsme->lsme_extent.e_end;
+ } else {
+ cl->cl_is_composite = false;
}
+
rc = lov_lsm_pack(lsm, buf->lb_buf, buf->lb_len);
lov_lsm_put(lsm);
--
1.8.3.1
More information about the lustre-devel
mailing list