Commit 15b241c5 authored by wang di's avatar wang di Committed by Greg Kroah-Hartman
Browse files

staging: lustre: lmv: Do not revalidate stripes with master lock



Do not revalidate slave stripes while holding master lock.
Otherwise if the revalidating slaves are blocked, then the
master lock can not be released in time.

Remove some unnecesary merging in ll_revalidate_slave(), and
the attributes will be stored in each stripe, only
merging them if required.

Signed-off-by: default avatarwang di <di.wang@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6088
Reviewed-on: http://review.whamcloud.com/13432


Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Reviewed-by: default avatarLai Siyao <lai.siyao@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarJames Simmons <jsimmons@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0022c6bc
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -1000,10 +1000,7 @@ struct md_ops {

	int (*merge_attr)(struct obd_export *,
			  const struct lmv_stripe_md *lsm,
			  struct cl_attr *attr);

	int (*update_lsm_md)(struct obd_export *, struct lmv_stripe_md *lsm,
			     struct mdt_body *, ldlm_blocking_callback);
			  struct cl_attr *attr, ldlm_blocking_callback);

	int (*set_open_replay_data)(struct obd_export *,
				    struct obd_client_handle *,
+3 −12
Original line number Diff line number Diff line
@@ -1497,23 +1497,14 @@ static inline int md_free_lustre_md(struct obd_export *exp,
	return MDP(exp->exp_obd, free_lustre_md)(exp, md);
}

static inline int md_update_lsm_md(struct obd_export *exp,
				   struct lmv_stripe_md *lsm,
				   struct mdt_body *body,
				   ldlm_blocking_callback cb)
{
	EXP_CHECK_MD_OP(exp, update_lsm_md);
	EXP_MD_COUNTER_INCREMENT(exp, update_lsm_md);
	return MDP(exp->exp_obd, update_lsm_md)(exp, lsm, body, cb);
}

static inline int md_merge_attr(struct obd_export *exp,
				const struct lmv_stripe_md *lsm,
				struct cl_attr *attr)
				struct cl_attr *attr,
				ldlm_blocking_callback cb)
{
	EXP_CHECK_MD_OP(exp, merge_attr);
	EXP_MD_COUNTER_INCREMENT(exp, merge_attr);
	return MDP(exp->exp_obd, merge_attr)(exp, lsm, attr);
	return MDP(exp->exp_obd, merge_attr)(exp, lsm, attr, cb);
}

static inline int md_setxattr(struct obd_export *exp, const struct lu_fid *fid,
+7 −12
Original line number Diff line number Diff line
@@ -3045,12 +3045,13 @@ static int ll_merge_md_attr(struct inode *inode)

	LASSERT(ll_i2info(inode)->lli_lsm_md);
	rc = md_merge_attr(ll_i2mdexp(inode), ll_i2info(inode)->lli_lsm_md,
			   &attr);
			   &attr, ll_md_blocking_ast);
	if (rc)
		return rc;

	ll_i2info(inode)->lli_stripe_dir_size = attr.cat_size;
	ll_i2info(inode)->lli_stripe_dir_nlink = attr.cat_nlink;
	set_nlink(inode, attr.cat_nlink);
	inode->i_blocks = attr.cat_blocks;
	i_size_write(inode, attr.cat_size);

	ll_i2info(inode)->lli_atime = attr.cat_atime;
	ll_i2info(inode)->lli_mtime = attr.cat_mtime;
@@ -3123,16 +3124,10 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat)
	stat->mtime = inode->i_mtime;
	stat->ctime = inode->i_ctime;
	stat->blksize = 1 << inode->i_blkbits;
	stat->blocks = inode->i_blocks;

	if (S_ISDIR(inode->i_mode) &&
	    ll_i2info(inode)->lli_lsm_md) {
		stat->nlink = lli->lli_stripe_dir_nlink;
		stat->size = lli->lli_stripe_dir_size;
	} else {
	stat->nlink = inode->i_nlink;
	stat->size = i_size_read(inode);
	}
	stat->blocks = inode->i_blocks;

	return 0;
}
+0 −3
Original line number Diff line number Diff line
@@ -191,9 +191,6 @@ struct ll_inode_info {
			unsigned int			lli_sa_generation;
			/* directory stripe information */
			struct lmv_stripe_md	       *lli_lsm_md;
			/* striped directory size */
			loff_t				lli_stripe_dir_size;
			u64				lli_stripe_dir_nlink;
		};

		/* for non-directory */
+1 −6
Original line number Diff line number Diff line
@@ -1117,12 +1117,7 @@ static int ll_init_lsm_md(struct inode *inode, struct lustre_md *md)
		}
	}

	/*
	 * Here is where the lsm is being initialized(fill lmo_info) after
	 * client retrieve MD stripe information from MDT.
	 */
	return md_update_lsm_md(ll_i2mdexp(inode), lsm, md->body,
				ll_md_blocking_ast);
	return 0;
}

static inline int lli_lsm_md_eq(const struct lmv_stripe_md *lsm_md1,
Loading