Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d82425f authored by wang di's avatar wang di Committed by Greg Kroah-Hartman
Browse files

staging: lustre: llite: a few fixes for migration.



1. Clear the client dentry cache before migrating file/directory
   to the remote MDT.

2. Do not return stripe information to client, if it did not get
   the layout lock.

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


Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Reviewed-by: default avatarJohn L. Hammond <john.hammond@intel.com>
Signed-off-by: default avatarJames Simmons <jsimmons@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fa1cc966
Loading
Loading
Loading
Loading
+6 −16
Original line number Diff line number Diff line
@@ -1318,11 +1318,9 @@ static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
		return 0;
	}
	case IOC_MDC_LOOKUP: {
		struct ptlrpc_request *request = NULL;
		int namelen, len = 0;
		char *buf = NULL;
		char *filename;
		struct md_op_data *op_data;

		rc = obd_ioctl_getdata(&buf, &len, (void __user *)arg);
		if (rc)
@@ -1338,21 +1336,13 @@ static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
			goto out_free;
		}

		op_data = ll_prep_md_op_data(NULL, inode, NULL, filename, namelen,
					     0, LUSTRE_OPC_ANY, NULL);
		if (IS_ERR(op_data)) {
			rc = PTR_ERR(op_data);
			goto out_free;
		}

		op_data->op_valid = OBD_MD_FLID;
		rc = md_getattr_name(sbi->ll_md_exp, op_data, &request);
		ll_finish_md_op_data(op_data);
		rc = ll_get_fid_by_name(inode, filename, namelen, NULL);
		if (rc < 0) {
			CDEBUG(D_INFO, "md_getattr_name: %d\n", rc);
			CERROR("%s: lookup %.*s failed: rc = %d\n",
			       ll_get_fsname(inode->i_sb, NULL, 0), namelen,
			       filename, rc);
			goto out_free;
		}
		ptlrpc_req_finished(request);
out_free:
		obd_ioctl_freedata(buf, len);
		return rc;
@@ -1981,7 +1971,7 @@ static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

		filename = data->ioc_inlbuf1;
		namelen = data->ioc_inllen1;
		if (namelen < 1) {
		if (namelen < 1 || namelen != strlen(filename) + 1) {
			rc = -EINVAL;
			goto migrate_free;
		}
@@ -1992,7 +1982,7 @@ static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
		}
		mdtidx = *(int *)data->ioc_inlbuf2;

		rc = ll_migrate(inode, file, mdtidx, filename, namelen);
		rc = ll_migrate(inode, file, mdtidx, filename, namelen - 1);
migrate_free:
		obd_ioctl_freedata(buf, len);

+19 −15
Original line number Diff line number Diff line
@@ -2828,7 +2828,7 @@ ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock)
	return rc;
}

static int ll_get_fid_by_name(struct inode *parent, const char *name,
int ll_get_fid_by_name(struct inode *parent, const char *name,
		       int namelen, struct lu_fid *fid)
{
	struct md_op_data *op_data = NULL;
@@ -2843,20 +2843,19 @@ static int ll_get_fid_by_name(struct inode *parent, const char *name,

	op_data->op_valid = OBD_MD_FLID;
	rc = md_getattr_name(ll_i2sbi(parent)->ll_md_exp, op_data, &req);
	ll_finish_md_op_data(op_data);
	if (rc < 0)
		goto out_free;
		return rc;

	body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
	if (!body) {
		rc = -EFAULT;
		goto out_req;
	}
	if (fid)
		*fid = body->fid1;
out_req:
	ptlrpc_req_finished(req);
out_free:
	if (op_data)
		ll_finish_md_op_data(op_data);
	return rc;
}

@@ -2864,6 +2863,7 @@ int ll_migrate(struct inode *parent, struct file *file, int mdtidx,
	       const char *name, int namelen)
{
	struct ptlrpc_request *request = NULL;
	struct inode *child_inode = NULL;
	struct dentry *dchild = NULL;
	struct md_op_data *op_data;
	struct qstr qstr;
@@ -2884,8 +2884,13 @@ int ll_migrate(struct inode *parent, struct file *file, int mdtidx,
	dchild = d_lookup(file_dentry(file), &qstr);
	if (dchild && dchild->d_inode) {
		op_data->op_fid3 = *ll_inode2fid(dchild->d_inode);
		if (dchild->d_inode) {
			child_inode = igrab(dchild->d_inode);
			ll_invalidate_aliases(child_inode);
		}
		dput(dchild);
	} else {
		rc = ll_get_fid_by_name(parent, name, strnlen(name, namelen),
		rc = ll_get_fid_by_name(parent, name, namelen,
					&op_data->op_fid3);
		if (rc)
			goto out_free;
@@ -2895,6 +2900,7 @@ int ll_migrate(struct inode *parent, struct file *file, int mdtidx,
		CERROR("%s: migrate %s, but fid "DFID" is insane\n",
		       ll_get_fsname(parent->i_sb, NULL, 0), name,
		       PFID(&op_data->op_fid3));
		rc = -EINVAL;
		goto out_free;
	}

@@ -2912,18 +2918,16 @@ int ll_migrate(struct inode *parent, struct file *file, int mdtidx,
	op_data->op_mds = mdtidx;
	op_data->op_cli_flags = CLI_MIGRATE;
	rc = md_rename(ll_i2sbi(parent)->ll_md_exp, op_data, name,
		       strnlen(name, namelen), name, strnlen(name, namelen),
		       &request);
		       namelen, name, namelen, &request);
	if (!rc)
		ll_update_times(request, parent);

	ptlrpc_req_finished(request);

out_free:
	if (dchild) {
		if (dchild->d_inode)
			ll_delete_inode(dchild->d_inode);
		dput(dchild);
	if (child_inode) {
		clear_nlink(child_inode);
		iput(child_inode);
	}

	ll_finish_md_op_data(op_data);
+2 −0
Original line number Diff line number Diff line
@@ -721,6 +721,8 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat);
struct posix_acl *ll_get_acl(struct inode *inode, int type);
int ll_migrate(struct inode *parent, struct file *file, int mdtidx,
	       const char *name, int namelen);
int ll_get_fid_by_name(struct inode *parent, const char *name,
		       int namelen, struct lu_fid *fid);
int ll_inode_permission(struct inode *inode, int mask);

int ll_lov_setstripe_ea_info(struct inode *inode, struct dentry *dentry,
+1 −0
Original line number Diff line number Diff line
@@ -224,6 +224,7 @@ static int lov_init_raid0(const struct lu_env *env,

	LASSERT(!lov->lo_lsm);
	lov->lo_lsm = lsm_addref(lsm);
	lov->lo_layout_invalid = true;
	r0->lo_nr  = lsm->lsm_stripe_count;
	LASSERT(r0->lo_nr <= lov_targets_nr(dev));