diff --git a/fs/lustre/llite/dir.c b/fs/lustre/llite/dir.c
index 2e44f9bb3895..98da2c95ca37 100644
--- a/fs/lustre/llite/dir.c
+++ b/fs/lustre/llite/dir.c
@@ -162,11 +162,11 @@ void ll_release_page(struct inode *inode, struct page *page, bool remove)
 {
 	kunmap(page);
 
-	/* Always remove the page for striped dir, because the page is
+	/*
+	 * Always remove the page for striped dir, because the page is
 	 * built from temporarily in LMV layer
 	 */
-	if (inode && S_ISDIR(inode->i_mode) &&
-	    lmv_dir_striped(ll_i2info(inode)->lli_lsm_md)) {
+	if (inode && ll_dir_striped(inode)) {
 		__free_page(page);
 		return;
 	}
diff --git a/fs/lustre/llite/file.c b/fs/lustre/llite/file.c
index 11006682be1a..c99e9c01bc65 100644
--- a/fs/lustre/llite/file.c
+++ b/fs/lustre/llite/file.c
@@ -5330,14 +5330,12 @@ static int ll_merge_md_attr(struct inode *inode)
 	struct cl_attr attr = { 0 };
 	int rc;
 
-	if (!lli->lli_lsm_md)
+	LASSERT(lli->lli_lsm_md);
+
+	if (!lmv_dir_striped(lli->lli_lsm_md))
 		return 0;
 
 	down_read(&lli->lli_lsm_sem);
-	if (!lmv_dir_striped(lli->lli_lsm_md)) {
-		up_read(&lli->lli_lsm_sem);
-		return 0;
-	}
 	rc = md_merge_attr(ll_i2mdexp(inode), lli->lli_lsm_md, &attr,
 			   ll_md_blocking_ast);
 	up_read(&lli->lli_lsm_sem);
diff --git a/fs/lustre/llite/llite_internal.h b/fs/lustre/llite/llite_internal.h
index e86d700a182b..42f991ea9a7e 100644
--- a/fs/lustre/llite/llite_internal.h
+++ b/fs/lustre/llite/llite_internal.h
@@ -1469,22 +1469,9 @@ static inline struct lu_fid *ll_inode2fid(struct inode *inode)
 
 static inline bool ll_dir_striped(struct inode *inode)
 {
-	struct ll_inode_info *lli;
-	bool rc;
-
 	LASSERT(inode);
-	if (!S_ISDIR(inode->i_mode))
-		return false;
-
-	lli = ll_i2info(inode);
-	if (!lli->lli_lsm_md)
-		return false;
-
-	down_read(&lli->lli_lsm_sem);
-	rc = lmv_dir_striped(lli->lli_lsm_md);
-	up_read(&lli->lli_lsm_sem);
-
-	return rc;
+	return S_ISDIR(inode->i_mode) &&
+	       lmv_dir_striped(ll_i2info(inode)->lli_lsm_md);
 }
 
 static inline loff_t ll_file_maxbytes(struct inode *inode)
diff --git a/fs/lustre/llite/llite_lib.c b/fs/lustre/llite/llite_lib.c
index 751886b47445..37327be5be66 100644
--- a/fs/lustre/llite/llite_lib.c
+++ b/fs/lustre/llite/llite_lib.c
@@ -1702,25 +1702,23 @@ static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md)
 	}
 
 	rc = ll_init_lsm_md(inode, md);
-	if (rc) {
-		up_write(&lli->lli_lsm_sem);
-		return rc;
-	}
+	up_write(&lli->lli_lsm_sem);
 
-	/* md_merge_attr() may take long, since lsm is already set, switch to
-	 * read lock.
-	 */
-	downgrade_write(&lli->lli_lsm_sem);
+	if (rc)
+		return rc;
 
 	/* set md->lmv to NULL, so the following free lustre_md will not free
 	 * this lsm.
 	 */
 	md->lmv = NULL;
 
-	if (!lmv_dir_striped(lli->lli_lsm_md)) {
-		rc = 0;
+	/* md_merge_attr() may take long, since lsm is already set, switch to
+	 * read lock.
+	 */
+	down_read(&lli->lli_lsm_sem);
+
+	if (!lmv_dir_striped(lli->lli_lsm_md))
 		goto unlock;
-	}
 
 	attr = kzalloc(sizeof(*attr), GFP_NOFS);
 	if (!attr) {
diff --git a/fs/lustre/llite/namei.c b/fs/lustre/llite/namei.c
index 920b592489ab..59a7bbb7a99f 100644
--- a/fs/lustre/llite/namei.c
+++ b/fs/lustre/llite/namei.c
@@ -746,17 +746,14 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request,
 			.it_op = IT_GETATTR,
 			.it_lock_handle = 0
 		};
-		struct ll_inode_info *lli = ll_i2info(parent);
-		struct lu_fid fid = lli->lli_fid;
+		struct lu_fid fid = ll_i2info(parent)->lli_fid;
 
 		/* If it is striped directory, get the real stripe parent */
 		if (unlikely(ll_dir_striped(parent))) {
-			down_read(&lli->lli_lsm_sem);
 			rc = md_get_fid_from_lsm(ll_i2mdexp(parent),
-						 lli->lli_lsm_md,
+						 ll_i2info(parent)->lli_lsm_md,
 						 (*de)->d_name.name,
 						 (*de)->d_name.len, &fid);
-			up_read(&lli->lli_lsm_sem);
 			if (rc)
 				return rc;
 		}
diff --git a/fs/lustre/llite/statahead.c b/fs/lustre/llite/statahead.c
index 59688b4d7c7f..c820455cc3af 100644
--- a/fs/lustre/llite/statahead.c
+++ b/fs/lustre/llite/statahead.c
@@ -1211,10 +1211,8 @@ static int ll_statahead_thread(void *arg)
 		}
 
 		pos = le64_to_cpu(dp->ldp_hash_end);
-		down_read(&lli->lli_lsm_sem);
 		ll_release_page(dir, page,
 				le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE);
-		up_read(&lli->lli_lsm_sem);
 
 		if (sa_low_hit(sai)) {
 			rc = -EFAULT;
diff --git a/fs/lustre/lmv/lmv_obd.c b/fs/lustre/lmv/lmv_obd.c
index 98ee902d8cb5..27345a2a65b0 100644
--- a/fs/lustre/lmv/lmv_obd.c
+++ b/fs/lustre/lmv/lmv_obd.c
@@ -3730,8 +3730,7 @@ lmv_get_fid_from_lsm(struct obd_export *exp,
 {
 	const struct lmv_oinfo *oinfo;
 
-	if (!lmv_dir_striped(lsm))
-		return -ESTALE;
+	LASSERT(lmv_dir_striped(lsm));
 
 	oinfo = lsm_name_to_stripe_info(lsm, name, namelen, false);
 	if (IS_ERR(oinfo))
