Whamcloud - gitweb
LU-5410 mdd: return errors from mdo_declare_ref_add()
[fs/lustre-release.git] / lustre / mdd / mdd_dir.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2011, 2013, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lustre/mdd/mdd_dir.c
37  *
38  * Lustre Metadata Server (mdd) routines
39  *
40  * Author: Wang Di <wangdi@intel.com>
41  */
42
43 #define DEBUG_SUBSYSTEM S_MDS
44
45 #include <obd_class.h>
46 #include <obd_support.h>
47 #include <lustre_mds.h>
48 #include <lustre_fid.h>
49
50 #include "mdd_internal.h"
51
52 static const char dot[] = ".";
53 static const char dotdot[] = "..";
54
55 static struct lu_name lname_dotdot = {
56         (char *) dotdot,
57         sizeof(dotdot) - 1
58 };
59
60 static inline int
61 mdd_name_check(struct mdd_device *m, const struct lu_name *ln)
62 {
63         if (!lu_name_is_valid(ln))
64                 return -EINVAL;
65         else if (ln->ln_namelen > m->mdd_dt_conf.ddp_max_name_len)
66                 return -ENAMETOOLONG;
67         else
68                 return 0;
69 }
70
71 /* Get FID from name and parent */
72 static int
73 __mdd_lookup(const struct lu_env *env, struct md_object *pobj,
74              const struct lu_attr *pattr, const struct lu_name *lname,
75              struct lu_fid* fid, int mask)
76 {
77         const char *name                = lname->ln_name;
78         const struct dt_key *key        = (const struct dt_key *)name;
79         struct mdd_object *mdd_obj      = md2mdd_obj(pobj);
80         struct mdd_device *m            = mdo2mdd(pobj);
81         struct dt_object *dir           = mdd_object_child(mdd_obj);
82         int rc;
83         ENTRY;
84
85         if (unlikely(mdd_is_dead_obj(mdd_obj)))
86                 RETURN(-ESTALE);
87
88         if (mdd_object_remote(mdd_obj)) {
89                 CDEBUG(D_INFO, "%s: Object "DFID" locates on remote server\n",
90                        mdd2obd_dev(m)->obd_name, PFID(mdo2fid(mdd_obj)));
91         } else if (!mdd_object_exists(mdd_obj)) {
92                 RETURN(-ESTALE);
93         }
94
95         rc = mdd_permission_internal_locked(env, mdd_obj, pattr, mask,
96                                             MOR_TGT_PARENT);
97         if (rc)
98                 RETURN(rc);
99
100         if (likely(S_ISDIR(mdd_object_type(mdd_obj)) &&
101                    dt_try_as_dir(env, dir))) {
102
103                 rc = dir->do_index_ops->dio_lookup(env, dir,
104                                                  (struct dt_rec *)fid, key,
105                                                  mdd_object_capa(env, mdd_obj));
106                 if (rc > 0)
107                         rc = 0;
108                 else if (rc == 0)
109                         rc = -ENOENT;
110         } else
111                 rc = -ENOTDIR;
112
113         RETURN(rc);
114 }
115
116 int mdd_lookup(const struct lu_env *env,
117                struct md_object *pobj, const struct lu_name *lname,
118                struct lu_fid *fid, struct md_op_spec *spec)
119 {
120         struct lu_attr *pattr = MDD_ENV_VAR(env, pattr);
121         int rc;
122         ENTRY;
123
124         rc = mdd_la_get(env, md2mdd_obj(pobj), pattr, BYPASS_CAPA);
125         if (rc != 0)
126                 RETURN(rc);
127
128         rc = __mdd_lookup(env, pobj, pattr, lname, fid, MAY_EXEC);
129         RETURN(rc);
130 }
131
132 static inline int mdd_parent_fid(const struct lu_env *env,
133                                  struct mdd_object *obj,
134                                  const struct lu_attr *attr,
135                                  struct lu_fid *fid)
136 {
137         return __mdd_lookup(env, &obj->mod_obj, attr, &lname_dotdot, fid, 0);
138 }
139
140 /*
141  * For root fid use special function, which does not compare version component
142  * of fid. Version component is different for root fids on all MDTs.
143  */
144 int mdd_is_root(struct mdd_device *mdd, const struct lu_fid *fid)
145 {
146         return fid_seq(&mdd->mdd_root_fid) == fid_seq(fid) &&
147                 fid_oid(&mdd->mdd_root_fid) == fid_oid(fid);
148 }
149
150 /*
151  * return 1: if lf is the fid of the ancestor of p1;
152  * return 0: if not;
153  *
154  * return -EREMOTE: if remote object is found, in this
155  * case fid of remote object is saved to @pf;
156  *
157  * otherwise: values < 0, errors.
158  */
159 static int mdd_is_parent(const struct lu_env *env,
160                         struct mdd_device *mdd,
161                         struct mdd_object *p1,
162                         const struct lu_attr *attr,
163                         const struct lu_fid *lf,
164                         struct lu_fid *pf)
165 {
166         struct mdd_object *parent = NULL;
167         struct lu_fid *pfid;
168         int rc;
169         ENTRY;
170
171         LASSERT(!lu_fid_eq(mdo2fid(p1), lf));
172         pfid = &mdd_env_info(env)->mti_fid;
173
174         /* Check for root first. */
175         if (mdd_is_root(mdd, mdo2fid(p1)))
176                 RETURN(0);
177
178         for(;;) {
179                 /* this is done recursively, bypass capa for each obj */
180                 mdd_set_capainfo(env, 4, p1, BYPASS_CAPA);
181                 rc = mdd_parent_fid(env, p1, attr, pfid);
182                 if (rc)
183                         GOTO(out, rc);
184                 if (mdd_is_root(mdd, pfid))
185                         GOTO(out, rc = 0);
186                 if (lu_fid_eq(pfid, &mdd->mdd_local_root_fid))
187                         GOTO(out, rc = 0);
188                 if (lu_fid_eq(pfid, lf))
189                         GOTO(out, rc = 1);
190                 if (parent)
191                         mdd_object_put(env, parent);
192
193                 parent = mdd_object_find(env, mdd, pfid);
194                 if (IS_ERR(parent)) {
195                         GOTO(out, rc = PTR_ERR(parent));
196                 } else if (mdd_object_remote(parent)) {
197                         /*FIXME: Because of the restriction of rename in Phase I.
198                          * If the parent is remote, we just assumed lf is not the
199                          * parent of P1 for now */
200                         GOTO(out, rc = 0);
201                 }
202                 p1 = parent;
203         }
204         EXIT;
205 out:
206         if (parent && !IS_ERR(parent))
207                 mdd_object_put(env, parent);
208         return rc;
209 }
210
211 /*
212  * No permission check is needed.
213  *
214  * returns 1: if fid is ancestor of @mo;
215  * returns 0: if fid is not a ancestor of @mo;
216  *
217  * returns EREMOTE if remote object is found, fid of remote object is saved to
218  * @fid;
219  *
220  * returns < 0: if error
221  */
222 int mdd_is_subdir(const struct lu_env *env, struct md_object *mo,
223                   const struct lu_fid *fid, struct lu_fid *sfid)
224 {
225         struct mdd_device *mdd = mdo2mdd(mo);
226         struct lu_attr *attr = MDD_ENV_VAR(env, cattr);
227         int rc;
228         ENTRY;
229
230         if (!S_ISDIR(mdd_object_type(md2mdd_obj(mo))))
231                 RETURN(0);
232
233         rc = mdd_la_get(env, md2mdd_obj(mo), attr, BYPASS_CAPA);
234         if (rc != 0)
235                 RETURN(rc);
236
237         rc = mdd_is_parent(env, mdd, md2mdd_obj(mo), attr, fid, sfid);
238         if (rc == 0) {
239                 /* found root */
240                 fid_zero(sfid);
241         } else if (rc == 1) {
242                 /* found @fid is parent */
243                 *sfid = *fid;
244                 rc = 0;
245         }
246         RETURN(rc);
247 }
248
249 /*
250  * Check that @dir contains no entries except (possibly) dot and dotdot.
251  *
252  * Returns:
253  *
254  *             0        empty
255  *      -ENOTDIR        not a directory object
256  *    -ENOTEMPTY        not empty
257  *           -ve        other error
258  *
259  */
260 static int mdd_dir_is_empty(const struct lu_env *env,
261                             struct mdd_object *dir)
262 {
263         struct dt_it     *it;
264         struct dt_object *obj;
265         const struct dt_it_ops *iops;
266         int result;
267         ENTRY;
268
269         obj = mdd_object_child(dir);
270         if (!dt_try_as_dir(env, obj))
271                 RETURN(-ENOTDIR);
272
273         iops = &obj->do_index_ops->dio_it;
274         it = iops->init(env, obj, LUDA_64BITHASH, BYPASS_CAPA);
275         if (!IS_ERR(it)) {
276                 result = iops->get(env, it, (const struct dt_key *)"");
277                 if (result > 0) {
278                         int i;
279                         for (result = 0, i = 0; result == 0 && i < 3; ++i)
280                                 result = iops->next(env, it);
281                         if (result == 0)
282                                 result = -ENOTEMPTY;
283                         else if (result == 1)
284                                 result = 0;
285                 } else if (result == 0)
286                         /*
287                          * Huh? Index contains no zero key?
288                          */
289                         result = -EIO;
290
291                 iops->put(env, it);
292                 iops->fini(env, it);
293         } else
294                 result = PTR_ERR(it);
295         RETURN(result);
296 }
297
298 /**
299  * Determine if the target object can be hard linked, and right now it only
300  * checks if the link count reach the maximum limit. Note: for ldiskfs, the
301  * directory nlink count might exceed the maximum link count(see
302  * osd_object_ref_add), so it only check nlink for non-directories.
303  *
304  * \param[in] env       thread environment
305  * \param[in] obj       object being linked to
306  * \param[in] la        attributes of \a obj
307  *
308  * \retval              0 if \a obj can be hard linked
309  * \retval              negative error if \a obj is a directory or has too
310  *                      many links
311  */
312 static int __mdd_may_link(const struct lu_env *env, struct mdd_object *obj,
313                           const struct lu_attr *la)
314 {
315         struct mdd_device *m = mdd_obj2mdd_dev(obj);
316         ENTRY;
317
318         LASSERT(la != NULL);
319
320         /* Subdir count limitation can be broken through
321          * (see osd_object_ref_add), so only check non-directory here. */
322         if (!S_ISDIR(la->la_mode) &&
323             la->la_nlink >= m->mdd_dt_conf.ddp_max_nlink)
324                 RETURN(-EMLINK);
325
326         RETURN(0);
327 }
328
329 /**
330  * Check whether it may create the cobj under the pobj.
331  *
332  * \param[in] env       execution environment
333  * \param[in] pobj      the parent directory
334  * \param[in] pattr     the attribute of the parent directory
335  * \param[in] cobj      the child to be created
336  * \param[in] check_perm        if check WRITE|EXEC permission for parent
337  *
338  * \retval              = 0 create the child under this dir is allowed
339  * \retval              negative errno create the child under this dir is
340  *                      not allowed
341  */
342 int mdd_may_create(const struct lu_env *env, struct mdd_object *pobj,
343                    const struct lu_attr *pattr, struct mdd_object *cobj,
344                    bool check_perm)
345 {
346         struct mdd_thread_info *info = mdd_env_info(env);
347         struct lu_buf   *xbuf;
348         int rc = 0;
349         ENTRY;
350
351         if (cobj && mdd_object_exists(cobj))
352                 RETURN(-EEXIST);
353
354         if (mdd_is_dead_obj(pobj))
355                 RETURN(-ENOENT);
356
357         /* If the parent is a sub-stripe, check whether it is dead */
358         xbuf = mdd_buf_get(env, info->mti_key, sizeof(info->mti_key));
359         rc = mdo_xattr_get(env, pobj, xbuf, XATTR_NAME_LMV,
360                            mdd_object_capa(env, pobj));
361         if (unlikely(rc > 0)) {
362                 struct lmv_mds_md_v1  *lmv1 = xbuf->lb_buf;
363
364                 if (le32_to_cpu(lmv1->lmv_magic) == LMV_MAGIC_STRIPE &&
365                     le32_to_cpu(lmv1->lmv_hash_type) & LMV_HASH_FLAG_DEAD)
366                         RETURN(-ESTALE);
367         }
368         rc = 0;
369
370         if (check_perm)
371                 rc = mdd_permission_internal_locked(env, pobj, pattr,
372                                                     MAY_WRITE | MAY_EXEC,
373                                                     MOR_TGT_PARENT);
374         RETURN(rc);
375 }
376
377 /*
378  * Check whether can unlink from the pobj in the case of "cobj == NULL".
379  */
380 int mdd_may_unlink(const struct lu_env *env, struct mdd_object *pobj,
381                    const struct lu_attr *pattr, const struct lu_attr *attr)
382 {
383         int rc;
384         ENTRY;
385
386         if (mdd_is_dead_obj(pobj))
387                 RETURN(-ENOENT);
388
389         if ((attr->la_valid & LA_FLAGS) &&
390             (attr->la_flags & (LUSTRE_APPEND_FL | LUSTRE_IMMUTABLE_FL)))
391                 RETURN(-EPERM);
392
393         rc = mdd_permission_internal_locked(env, pobj, pattr,
394                                             MAY_WRITE | MAY_EXEC,
395                                             MOR_TGT_PARENT);
396         if (rc)
397                 RETURN(rc);
398
399         if (mdd_is_append(pobj))
400                 RETURN(-EPERM);
401
402         RETURN(rc);
403 }
404
405 /*
406  * pobj == NULL is remote ops case, under such case, pobj's
407  * VTX feature has been checked already, no need check again.
408  */
409 static inline int mdd_is_sticky(const struct lu_env *env,
410                                 struct mdd_object *pobj,
411                                 const struct lu_attr *pattr,
412                                 struct mdd_object *cobj,
413                                 const struct lu_attr *cattr)
414 {
415         struct lu_ucred *uc = lu_ucred_assert(env);
416
417         if (pobj != NULL) {
418                 LASSERT(pattr != NULL);
419                 if (!(pattr->la_mode & S_ISVTX) ||
420                     (pattr->la_uid == uc->uc_fsuid))
421                         return 0;
422         }
423
424         LASSERT(cattr != NULL);
425         if (cattr->la_uid == uc->uc_fsuid)
426                 return 0;
427
428         return !md_capable(uc, CFS_CAP_FOWNER);
429 }
430
431 static int mdd_may_delete_entry(const struct lu_env *env,
432                                 struct mdd_object *pobj,
433                                 const struct lu_attr *pattr,
434                                 int check_perm)
435 {
436         ENTRY;
437
438         LASSERT(pobj != NULL);
439         if (!mdd_object_exists(pobj))
440                 RETURN(-ENOENT);
441
442         if (mdd_is_dead_obj(pobj))
443                 RETURN(-ENOENT);
444
445         if (check_perm) {
446                 int rc;
447                 rc = mdd_permission_internal_locked(env, pobj, pattr,
448                                             MAY_WRITE | MAY_EXEC,
449                                             MOR_TGT_PARENT);
450                 if (rc)
451                         RETURN(rc);
452         }
453
454         if (mdd_is_append(pobj))
455                 RETURN(-EPERM);
456
457         RETURN(0);
458 }
459
460 /*
461  * Check whether it may delete the cobj from the pobj.
462  * pobj maybe NULL
463  */
464 int mdd_may_delete(const struct lu_env *env, struct mdd_object *tpobj,
465                    const struct lu_attr *tpattr, struct mdd_object *tobj,
466                    const struct lu_attr *tattr, const struct lu_attr *cattr,
467                    int check_perm, int check_empty)
468 {
469         int rc = 0;
470         ENTRY;
471
472         if (tpobj) {
473                 LASSERT(tpattr != NULL);
474                 rc = mdd_may_delete_entry(env, tpobj, tpattr, check_perm);
475                 if (rc != 0)
476                         RETURN(rc);
477         }
478
479         if (tobj == NULL)
480                 RETURN(0);
481
482         if (!mdd_object_exists(tobj))
483                 RETURN(-ENOENT);
484
485         if (mdd_is_dead_obj(tobj))
486                 RETURN(-ESTALE);
487
488         if (mdd_is_sticky(env, tpobj, tpattr, tobj, tattr))
489                 RETURN(-EPERM);
490
491         if (mdd_is_immutable(tobj) || mdd_is_append(tobj))
492                 RETURN(-EPERM);
493
494         if ((tattr->la_valid & LA_FLAGS) &&
495             (tattr->la_flags & (LUSTRE_APPEND_FL | LUSTRE_IMMUTABLE_FL)))
496                 RETURN(-EPERM);
497
498         /* additional check the rename case */
499         if (cattr) {
500                 if (S_ISDIR(cattr->la_mode)) {
501                         struct mdd_device *mdd = mdo2mdd(&tobj->mod_obj);
502
503                         if (!S_ISDIR(tattr->la_mode))
504                                 RETURN(-ENOTDIR);
505
506                         if (lu_fid_eq(mdo2fid(tobj), &mdd->mdd_root_fid))
507                                 RETURN(-EBUSY);
508                 } else if (S_ISDIR(tattr->la_mode))
509                         RETURN(-EISDIR);
510         }
511
512         if (S_ISDIR(tattr->la_mode) && check_empty)
513                 rc = mdd_dir_is_empty(env, tobj);
514
515         RETURN(rc);
516 }
517
518 /**
519  * Check whether it can create the link file(linked to @src_obj) under
520  * the target directory(@tgt_obj), and src_obj has been locked by
521  * mdd_write_lock.
522  *
523  * \param[in] env       execution environment
524  * \param[in] tgt_obj   the target directory
525  * \param[in] tattr     attributes of target directory
526  * \param[in] lname     the link name
527  * \param[in] src_obj   source object for link
528  * \param[in] cattr     attributes for source object
529  *
530  * \retval              = 0 it is allowed to create the link file under tgt_obj
531  * \retval              negative error not allowed to create the link file
532  */
533 static int mdd_link_sanity_check(const struct lu_env *env,
534                                  struct mdd_object *tgt_obj,
535                                  const struct lu_attr *tattr,
536                                  const struct lu_name *lname,
537                                  struct mdd_object *src_obj,
538                                  const struct lu_attr *cattr)
539 {
540         struct mdd_device *m = mdd_obj2mdd_dev(src_obj);
541         int rc = 0;
542         ENTRY;
543
544         if (!mdd_object_exists(src_obj))
545                 RETURN(-ENOENT);
546
547         if (mdd_is_dead_obj(src_obj))
548                 RETURN(-ESTALE);
549
550         /* Local ops, no lookup before link, check filename length here. */
551         rc = mdd_name_check(m, lname);
552         if (rc < 0)
553                 RETURN(rc);
554
555         if (mdd_is_immutable(src_obj) || mdd_is_append(src_obj))
556                 RETURN(-EPERM);
557
558         if (S_ISDIR(mdd_object_type(src_obj)))
559                 RETURN(-EPERM);
560
561         LASSERT(src_obj != tgt_obj);
562         rc = mdd_may_create(env, tgt_obj, tattr, NULL, true);
563         if (rc != 0)
564                 RETURN(rc);
565
566         rc = __mdd_may_link(env, src_obj, cattr);
567
568         RETURN(rc);
569 }
570
571 static int __mdd_index_delete_only(const struct lu_env *env, struct mdd_object *pobj,
572                                    const char *name, struct thandle *handle,
573                                    struct lustre_capa *capa)
574 {
575         struct dt_object *next = mdd_object_child(pobj);
576         int               rc;
577         ENTRY;
578
579         if (dt_try_as_dir(env, next)) {
580                 rc = next->do_index_ops->dio_delete(env, next,
581                                                     (struct dt_key *)name,
582                                                     handle, capa);
583         } else
584                 rc = -ENOTDIR;
585
586         RETURN(rc);
587 }
588
589 static int __mdd_index_insert_only(const struct lu_env *env,
590                                    struct mdd_object *pobj,
591                                    const struct lu_fid *lf, __u32 type,
592                                    const char *name,
593                                    struct thandle *handle,
594                                    struct lustre_capa *capa)
595 {
596         struct dt_object *next = mdd_object_child(pobj);
597         int               rc;
598         ENTRY;
599
600         if (dt_try_as_dir(env, next)) {
601                 struct dt_insert_rec    *rec = &mdd_env_info(env)->mti_dt_rec;
602                 struct lu_ucred         *uc  = lu_ucred_check(env);
603                 int                      ignore_quota;
604
605                 rec->rec_fid = lf;
606                 rec->rec_type = type;
607                 ignore_quota = uc ? uc->uc_cap & CFS_CAP_SYS_RESOURCE_MASK : 1;
608                 rc = next->do_index_ops->dio_insert(env, next,
609                                                     (const struct dt_rec *)rec,
610                                                     (const struct dt_key *)name,
611                                                     handle, capa, ignore_quota);
612         } else {
613                 rc = -ENOTDIR;
614         }
615         RETURN(rc);
616 }
617
618 /* insert named index, add reference if isdir */
619 static int __mdd_index_insert(const struct lu_env *env, struct mdd_object *pobj,
620                               const struct lu_fid *lf, __u32 type,
621                               const char *name, struct thandle *handle,
622                               struct lustre_capa *capa)
623 {
624         int rc;
625         ENTRY;
626
627         rc = __mdd_index_insert_only(env, pobj, lf, type, name, handle, capa);
628         if (rc == 0 && S_ISDIR(type)) {
629                 mdd_write_lock(env, pobj, MOR_TGT_PARENT);
630                 mdo_ref_add(env, pobj, handle);
631                 mdd_write_unlock(env, pobj);
632         }
633
634         RETURN(rc);
635 }
636
637 /* delete named index, drop reference if isdir */
638 static int __mdd_index_delete(const struct lu_env *env, struct mdd_object *pobj,
639                               const char *name, int is_dir, struct thandle *handle,
640                               struct lustre_capa *capa)
641 {
642         int               rc;
643         ENTRY;
644
645         rc = __mdd_index_delete_only(env, pobj, name, handle, capa);
646         if (rc == 0 && is_dir) {
647                 mdd_write_lock(env, pobj, MOR_TGT_PARENT);
648                 mdo_ref_del(env, pobj, handle);
649                 mdd_write_unlock(env, pobj);
650         }
651
652         RETURN(rc);
653 }
654
655 int mdd_declare_changelog_store(const struct lu_env *env,
656                                 struct mdd_device *mdd,
657                                 const struct lu_name *fname,
658                                 struct thandle *handle)
659 {
660         struct obd_device               *obd = mdd2obd_dev(mdd);
661         struct llog_ctxt                *ctxt;
662         struct llog_changelog_rec       *rec;
663         struct lu_buf                   *buf;
664         int                              reclen;
665         int                              rc;
666
667         /* Not recording */
668         if (!(mdd->mdd_cl.mc_flags & CLM_ON))
669                 return 0;
670
671         reclen = llog_data_len(sizeof(*rec) +
672                                (fname != NULL ? fname->ln_namelen : 0));
673         buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen);
674         if (buf->lb_buf == NULL)
675                 return -ENOMEM;
676
677         rec = buf->lb_buf;
678         rec->cr_hdr.lrh_len = reclen;
679         rec->cr_hdr.lrh_type = CHANGELOG_REC;
680
681         ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
682         if (ctxt == NULL)
683                 return -ENXIO;
684
685         rc = llog_declare_add(env, ctxt->loc_handle, &rec->cr_hdr, handle);
686         llog_ctxt_put(ctxt);
687
688         return rc;
689 }
690
691 static int mdd_declare_changelog_ext_store(const struct lu_env *env,
692                                            struct mdd_device *mdd,
693                                            const struct lu_name *tname,
694                                            const struct lu_name *sname,
695                                            struct thandle *handle)
696 {
697         struct obd_device               *obd = mdd2obd_dev(mdd);
698         struct llog_ctxt                *ctxt;
699         struct llog_changelog_ext_rec   *rec;
700         struct lu_buf                   *buf;
701         int                              reclen;
702         int                              rc;
703
704         /* Not recording */
705         if (!(mdd->mdd_cl.mc_flags & CLM_ON))
706                 return 0;
707
708         reclen = llog_data_len(sizeof(*rec) +
709                                (tname != NULL ? tname->ln_namelen : 0) +
710                                (sname != NULL ? 1 + sname->ln_namelen : 0));
711         buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen);
712         if (buf->lb_buf == NULL)
713                 return -ENOMEM;
714
715         rec = buf->lb_buf;
716         rec->cr_hdr.lrh_len = reclen;
717         rec->cr_hdr.lrh_type = CHANGELOG_REC;
718
719         ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
720         if (ctxt == NULL)
721                 return -ENXIO;
722
723         rc = llog_declare_add(env, ctxt->loc_handle, &rec->cr_hdr, handle);
724         llog_ctxt_put(ctxt);
725
726         return rc;
727 }
728
729 /** Add a changelog entry \a rec to the changelog llog
730  * \param mdd
731  * \param rec
732  * \param handle - currently ignored since llogs start their own transaction;
733  *                 this will hopefully be fixed in llog rewrite
734  * \retval 0 ok
735  */
736 int mdd_changelog_store(const struct lu_env *env, struct mdd_device *mdd,
737                         struct llog_changelog_rec *rec, struct thandle *th)
738 {
739         struct obd_device       *obd = mdd2obd_dev(mdd);
740         struct llog_ctxt        *ctxt;
741         int                      rc;
742
743         rec->cr_hdr.lrh_len = llog_data_len(sizeof(*rec) + rec->cr.cr_namelen);
744         rec->cr_hdr.lrh_type = CHANGELOG_REC;
745         rec->cr.cr_time = cl_time();
746
747         spin_lock(&mdd->mdd_cl.mc_lock);
748         /* NB: I suppose it's possible llog_add adds out of order wrt cr_index,
749          * but as long as the MDD transactions are ordered correctly for e.g.
750          * rename conflicts, I don't think this should matter. */
751         rec->cr.cr_index = ++mdd->mdd_cl.mc_index;
752         spin_unlock(&mdd->mdd_cl.mc_lock);
753
754         ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
755         if (ctxt == NULL)
756                 return -ENXIO;
757
758         rc = llog_add(env, ctxt->loc_handle, &rec->cr_hdr, NULL, th);
759         llog_ctxt_put(ctxt);
760         if (rc > 0)
761                 rc = 0;
762         return rc;
763 }
764
765 /** Add a changelog_ext entry \a rec to the changelog llog
766  * \param mdd
767  * \param rec
768  * \param handle - currently ignored since llogs start their own transaction;
769  *              this will hopefully be fixed in llog rewrite
770  * \retval 0 ok
771  */
772 static int
773 mdd_changelog_ext_store(const struct lu_env *env, struct mdd_device *mdd,
774                         struct llog_changelog_ext_rec *rec, struct thandle *th)
775 {
776         struct obd_device       *obd = mdd2obd_dev(mdd);
777         struct llog_ctxt        *ctxt;
778         int                      rc;
779
780         rec->cr_hdr.lrh_len = llog_data_len(sizeof(*rec) + rec->cr.cr_namelen);
781         /* llog_lvfs_write_rec sets the llog tail len */
782         rec->cr_hdr.lrh_type = CHANGELOG_REC;
783         rec->cr.cr_time = cl_time();
784
785         spin_lock(&mdd->mdd_cl.mc_lock);
786         /* NB: I suppose it's possible llog_add adds out of order wrt cr_index,
787          * but as long as the MDD transactions are ordered correctly for e.g.
788          * rename conflicts, I don't think this should matter. */
789         rec->cr.cr_index = ++mdd->mdd_cl.mc_index;
790         spin_unlock(&mdd->mdd_cl.mc_lock);
791
792         ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
793         if (ctxt == NULL)
794                 return -ENXIO;
795
796         /* nested journal transaction */
797         rc = llog_add(env, ctxt->loc_handle, &rec->cr_hdr, NULL, th);
798         llog_ctxt_put(ctxt);
799         if (rc > 0)
800                 rc = 0;
801
802         return rc;
803 }
804
805 /** Store a namespace change changelog record
806  * If this fails, we must fail the whole transaction; we don't
807  * want the change to commit without the log entry.
808  * \param target - mdd_object of change
809  * \param parent - parent dir/object
810  * \param tname - target name string
811  * \param handle - transacion handle
812  */
813 int mdd_changelog_ns_store(const struct lu_env *env, struct mdd_device *mdd,
814                            enum changelog_rec_type type, unsigned flags,
815                            struct mdd_object *target, struct mdd_object *parent,
816                            const struct lu_name *tname, struct thandle *handle)
817 {
818         struct llog_changelog_rec *rec;
819         struct lu_buf *buf;
820         int reclen;
821         int rc;
822         ENTRY;
823
824         /* Not recording */
825         if (!(mdd->mdd_cl.mc_flags & CLM_ON))
826                 RETURN(0);
827         if ((mdd->mdd_cl.mc_mask & (1 << type)) == 0)
828                 RETURN(0);
829
830         LASSERT(target != NULL);
831         LASSERT(parent != NULL);
832         LASSERT(tname != NULL);
833         LASSERT(handle != NULL);
834
835         reclen = llog_data_len(sizeof(*rec) + tname->ln_namelen);
836         buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen);
837         if (buf->lb_buf == NULL)
838                 RETURN(-ENOMEM);
839         rec = buf->lb_buf;
840
841         rec->cr.cr_flags = CLF_VERSION | (CLF_FLAGMASK & flags);
842         rec->cr.cr_type = (__u32)type;
843         rec->cr.cr_tfid = *mdo2fid(target);
844         rec->cr.cr_pfid = *mdo2fid(parent);
845         rec->cr.cr_namelen = tname->ln_namelen;
846         memcpy(rec->cr.cr_name, tname->ln_name, tname->ln_namelen);
847
848         target->mod_cltime = cfs_time_current_64();
849
850         rc = mdd_changelog_store(env, mdd, rec, handle);
851         if (rc < 0) {
852                 CERROR("changelog failed: rc=%d, op%d %s c"DFID" p"DFID"\n",
853                         rc, type, tname->ln_name, PFID(&rec->cr.cr_tfid),
854                         PFID(&rec->cr.cr_pfid));
855                 RETURN(-EFAULT);
856         }
857
858         RETURN(0);
859 }
860
861
862 /** Store a namespace change changelog record
863  * If this fails, we must fail the whole transaction; we don't
864  * want the change to commit without the log entry.
865  * \param target - mdd_object of change
866  * \param tpfid - target parent dir/object fid
867  * \param sfid - source object fid
868  * \param spfid - source parent fid
869  * \param tname - target name string
870  * \param sname - source name string
871  * \param handle - transacion handle
872  */
873 static int mdd_changelog_ext_ns_store(const struct lu_env  *env,
874                                       struct mdd_device    *mdd,
875                                       enum changelog_rec_type type,
876                                       unsigned flags,
877                                       struct mdd_object    *target,
878                                       const struct lu_fid  *tpfid,
879                                       const struct lu_fid  *sfid,
880                                       const struct lu_fid  *spfid,
881                                       const struct lu_name *tname,
882                                       const struct lu_name *sname,
883                                       struct thandle *handle)
884 {
885         struct llog_changelog_ext_rec *rec;
886         struct lu_buf *buf;
887         int reclen;
888         int rc;
889         ENTRY;
890
891         /* Not recording */
892         if (!(mdd->mdd_cl.mc_flags & CLM_ON))
893                 RETURN(0);
894         if ((mdd->mdd_cl.mc_mask & (1 << type)) == 0)
895                 RETURN(0);
896
897         LASSERT(sfid != NULL);
898         LASSERT(tpfid != NULL);
899         LASSERT(tname != NULL);
900         LASSERT(handle != NULL);
901
902         reclen = llog_data_len(sizeof(*rec) +
903                                sname != NULL ? 1 + sname->ln_namelen : 0);
904         buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen);
905         if (buf->lb_buf == NULL)
906                 RETURN(-ENOMEM);
907         rec = buf->lb_buf;
908
909         rec->cr.cr_flags = CLF_EXT_VERSION | (CLF_FLAGMASK & flags);
910         rec->cr.cr_type = (__u32)type;
911         rec->cr.cr_pfid = *tpfid;
912         rec->cr.cr_sfid = *sfid;
913         rec->cr.cr_spfid = *spfid;
914         rec->cr.cr_namelen = tname->ln_namelen;
915         memcpy(rec->cr.cr_name, tname->ln_name, tname->ln_namelen);
916         if (sname) {
917                 rec->cr.cr_name[tname->ln_namelen] = '\0';
918                 memcpy(rec->cr.cr_name + tname->ln_namelen + 1, sname->ln_name,
919                         sname->ln_namelen);
920                 rec->cr.cr_namelen += 1 + sname->ln_namelen;
921         }
922
923         if (likely(target != NULL)) {
924                 rec->cr.cr_tfid = *mdo2fid(target);
925                 target->mod_cltime = cfs_time_current_64();
926         } else {
927                 fid_zero(&rec->cr.cr_tfid);
928         }
929
930         rc = mdd_changelog_ext_store(env, mdd, rec, handle);
931         if (rc < 0) {
932                 CERROR("changelog failed: rc=%d, op%d %s c"DFID" p"DFID"\n",
933                         rc, type, tname->ln_name, PFID(sfid), PFID(tpfid));
934                 return -EFAULT;
935         }
936
937         return 0;
938 }
939
940 static int __mdd_links_add(const struct lu_env *env,
941                            struct mdd_object *mdd_obj,
942                            struct linkea_data *ldata,
943                            const struct lu_name *lname,
944                            const struct lu_fid *pfid,
945                            int first, int check)
946 {
947         int rc;
948
949         if (ldata->ld_leh == NULL) {
950                 rc = first ? -ENODATA : mdd_links_read(env, mdd_obj, ldata);
951                 if (rc) {
952                         if (rc != -ENODATA)
953                                 return rc;
954                         rc = linkea_data_new(ldata,
955                                              &mdd_env_info(env)->mti_link_buf);
956                         if (rc)
957                                 return rc;
958                 }
959         }
960
961         if (check) {
962                 rc = linkea_links_find(ldata, lname, pfid);
963                 if (rc && rc != -ENOENT)
964                         return rc;
965                 if (rc == 0)
966                         return -EEXIST;
967         }
968
969         if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LINKEA_MORE)) {
970                 struct lu_fid *tfid = &mdd_env_info(env)->mti_fid2;
971
972                 *tfid = *pfid;
973                 tfid->f_ver = ~0;
974                 linkea_add_buf(ldata, lname, tfid);
975         }
976
977         if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LINKEA_MORE2))
978                 linkea_add_buf(ldata, lname, pfid);
979
980         return linkea_add_buf(ldata, lname, pfid);
981 }
982
983 static int __mdd_links_del(const struct lu_env *env,
984                            struct mdd_object *mdd_obj,
985                            struct linkea_data *ldata,
986                            const struct lu_name *lname,
987                            const struct lu_fid *pfid)
988 {
989         int rc;
990
991         if (ldata->ld_leh == NULL) {
992                 rc = mdd_links_read(env, mdd_obj, ldata);
993                 if (rc)
994                         return rc;
995         }
996
997         rc = linkea_links_find(ldata, lname, pfid);
998         if (rc)
999                 return rc;
1000
1001         linkea_del_buf(ldata, lname);
1002         return 0;
1003 }
1004
1005 static int mdd_linkea_prepare(const struct lu_env *env,
1006                               struct mdd_object *mdd_obj,
1007                               const struct lu_fid *oldpfid,
1008                               const struct lu_name *oldlname,
1009                               const struct lu_fid *newpfid,
1010                               const struct lu_name *newlname,
1011                               int first, int check,
1012                               struct linkea_data *ldata)
1013 {
1014         int rc = 0;
1015         int rc2 = 0;
1016         ENTRY;
1017
1018         if (OBD_FAIL_CHECK(OBD_FAIL_FID_IGIF))
1019                 return 0;
1020
1021         LASSERT(oldpfid != NULL || newpfid != NULL);
1022
1023         if (mdd_obj->mod_flags & DEAD_OBJ) {
1024                 /* Prevent linkea to be updated which is NOT necessary. */
1025                 ldata->ld_reclen = 0;
1026                 /* No more links, don't bother */
1027                 RETURN(0);
1028         }
1029
1030         if (oldpfid != NULL) {
1031                 rc = __mdd_links_del(env, mdd_obj, ldata, oldlname, oldpfid);
1032                 if (rc) {
1033                         if ((check == 1) ||
1034                             (rc != -ENODATA && rc != -ENOENT))
1035                                 RETURN(rc);
1036                         /* No changes done. */
1037                         rc = 0;
1038                 }
1039         }
1040
1041         /* If renaming, add the new record */
1042         if (newpfid != NULL) {
1043                 /* even if the add fails, we still delete the out-of-date
1044                  * old link */
1045                 rc2 = __mdd_links_add(env, mdd_obj, ldata, newlname, newpfid,
1046                                       first, check);
1047         }
1048
1049         rc = rc != 0 ? rc : rc2;
1050
1051         RETURN(rc);
1052 }
1053
1054 int mdd_links_rename(const struct lu_env *env,
1055                      struct mdd_object *mdd_obj,
1056                      const struct lu_fid *oldpfid,
1057                      const struct lu_name *oldlname,
1058                      const struct lu_fid *newpfid,
1059                      const struct lu_name *newlname,
1060                      struct thandle *handle,
1061                      struct linkea_data *ldata,
1062                      int first, int check)
1063 {
1064         int rc = 0;
1065         ENTRY;
1066
1067         if (ldata == NULL) {
1068                 ldata = &mdd_env_info(env)->mti_link_data;
1069                 memset(ldata, 0, sizeof(*ldata));
1070                 rc = mdd_linkea_prepare(env, mdd_obj, oldpfid, oldlname,
1071                                         newpfid, newlname, first, check,
1072                                         ldata);
1073                 if (rc != 0)
1074                         GOTO(out, rc);
1075         }
1076
1077         if (ldata->ld_reclen != 0)
1078                 rc = mdd_links_write(env, mdd_obj, ldata, handle);
1079         EXIT;
1080 out:
1081         if (rc != 0) {
1082                 int error = 1;
1083                 if (rc == -EOVERFLOW || rc == -ENOSPC)
1084                         error = 0;
1085                 if (oldpfid == NULL)
1086                         CDEBUG(error ? D_ERROR : D_OTHER,
1087                                "link_ea add '%.*s' failed %d "DFID"\n",
1088                                newlname->ln_namelen, newlname->ln_name,
1089                                rc, PFID(mdd_object_fid(mdd_obj)));
1090                 else if (newpfid == NULL)
1091                         CDEBUG(error ? D_ERROR : D_OTHER,
1092                                "link_ea del '%.*s' failed %d "DFID"\n",
1093                                oldlname->ln_namelen, oldlname->ln_name,
1094                                rc, PFID(mdd_object_fid(mdd_obj)));
1095                 else
1096                         CDEBUG(error ? D_ERROR : D_OTHER,
1097                                "link_ea rename '%.*s'->'%.*s' failed %d "
1098                                DFID"\n",
1099                                oldlname->ln_namelen, oldlname->ln_name,
1100                                newlname->ln_namelen, newlname->ln_name,
1101                                rc, PFID(mdd_object_fid(mdd_obj)));
1102         }
1103
1104         if (ldata->ld_buf && ldata->ld_buf->lb_len > OBD_ALLOC_BIG)
1105                 /* if we vmalloced a large buffer drop it */
1106                 lu_buf_free(ldata->ld_buf);
1107
1108         return rc;
1109 }
1110
1111 static inline int mdd_links_add(const struct lu_env *env,
1112                                 struct mdd_object *mdd_obj,
1113                                 const struct lu_fid *pfid,
1114                                 const struct lu_name *lname,
1115                                 struct thandle *handle,
1116                                 struct linkea_data *ldata, int first)
1117 {
1118         return mdd_links_rename(env, mdd_obj, NULL, NULL,
1119                                 pfid, lname, handle, ldata, first, 0);
1120 }
1121
1122 static inline int mdd_links_del(const struct lu_env *env,
1123                                 struct mdd_object *mdd_obj,
1124                                 const struct lu_fid *pfid,
1125                                 const struct lu_name *lname,
1126                                 struct thandle *handle)
1127 {
1128         return mdd_links_rename(env, mdd_obj, pfid, lname,
1129                                 NULL, NULL, handle, NULL, 0, 0);
1130 }
1131
1132 /** Read the link EA into a temp buffer.
1133  * Uses the mdd_thread_info::mti_big_buf since it is generally large.
1134  * A pointer to the buffer is stored in \a ldata::ld_buf.
1135  *
1136  * \retval 0 or error
1137  */
1138 int mdd_links_read(const struct lu_env *env, struct mdd_object *mdd_obj,
1139                    struct linkea_data *ldata)
1140 {
1141         int rc;
1142
1143         if (!mdd_object_exists(mdd_obj))
1144                 return -ENODATA;
1145
1146         /* First try a small buf */
1147         LASSERT(env != NULL);
1148         ldata->ld_buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_link_buf,
1149                                                PAGE_CACHE_SIZE);
1150         if (ldata->ld_buf->lb_buf == NULL)
1151                 return -ENOMEM;
1152
1153         rc = mdo_xattr_get(env, mdd_obj, ldata->ld_buf, XATTR_NAME_LINK,
1154                           BYPASS_CAPA);
1155         if (rc == -ERANGE) {
1156                 /* Buf was too small, figure out what we need. */
1157                 lu_buf_free(ldata->ld_buf);
1158                 rc = mdo_xattr_get(env, mdd_obj, ldata->ld_buf,
1159                                    XATTR_NAME_LINK, BYPASS_CAPA);
1160                 if (rc < 0)
1161                         return rc;
1162                 ldata->ld_buf = lu_buf_check_and_alloc(ldata->ld_buf, rc);
1163                 if (ldata->ld_buf->lb_buf == NULL)
1164                         return -ENOMEM;
1165                 rc = mdo_xattr_get(env, mdd_obj, ldata->ld_buf,
1166                                   XATTR_NAME_LINK, BYPASS_CAPA);
1167         }
1168         if (rc < 0) {
1169                 lu_buf_free(ldata->ld_buf);
1170                 ldata->ld_buf = NULL;
1171                 return rc;
1172         }
1173
1174         return linkea_init(ldata);
1175 }
1176
1177 /** Read the link EA into a temp buffer.
1178  * Uses the name_buf since it is generally large.
1179  * \retval IS_ERR err
1180  * \retval ptr to \a lu_buf (always \a mti_big_buf)
1181  */
1182 struct lu_buf *mdd_links_get(const struct lu_env *env,
1183                              struct mdd_object *mdd_obj)
1184 {
1185         struct linkea_data ldata = { 0 };
1186         int rc;
1187
1188         rc = mdd_links_read(env, mdd_obj, &ldata);
1189         return rc ? ERR_PTR(rc) : ldata.ld_buf;
1190 }
1191
1192 int mdd_links_write(const struct lu_env *env, struct mdd_object *mdd_obj,
1193                     struct linkea_data *ldata, struct thandle *handle)
1194 {
1195         const struct lu_buf *buf = mdd_buf_get_const(env, ldata->ld_buf->lb_buf,
1196                                                      ldata->ld_leh->leh_len);
1197         return mdo_xattr_set(env, mdd_obj, buf, XATTR_NAME_LINK, 0, handle,
1198                              mdd_object_capa(env, mdd_obj));
1199 }
1200
1201 int mdd_declare_links_add(const struct lu_env *env, struct mdd_object *mdd_obj,
1202                           struct thandle *handle, struct linkea_data *ldata)
1203 {
1204         int     rc;
1205         int     ea_len;
1206         void    *linkea;
1207
1208         if (ldata != NULL && ldata->ld_leh != NULL) {
1209                 ea_len = ldata->ld_leh->leh_len;
1210                 linkea = ldata->ld_buf->lb_buf;
1211         } else {
1212                 ea_len = DEFAULT_LINKEA_SIZE;
1213                 linkea = NULL;
1214         }
1215
1216         /* XXX: max size? */
1217         rc = mdo_declare_xattr_set(env, mdd_obj,
1218                                    mdd_buf_get_const(env, linkea, ea_len),
1219                                    XATTR_NAME_LINK, 0, handle);
1220         return rc;
1221 }
1222
1223 static inline int mdd_declare_links_del(const struct lu_env *env,
1224                                         struct mdd_object *c,
1225                                         struct thandle *handle)
1226 {
1227         int rc = 0;
1228
1229         /* For directory, the linkEA will be removed together
1230          * with the object. */
1231         if (!S_ISDIR(mdd_object_type(c)))
1232                 rc = mdd_declare_links_add(env, c, handle, NULL);
1233
1234         return rc;
1235 }
1236
1237 static int mdd_declare_link(const struct lu_env *env,
1238                             struct mdd_device *mdd,
1239                             struct mdd_object *p,
1240                             struct mdd_object *c,
1241                             const struct lu_name *name,
1242                             struct thandle *handle,
1243                             struct lu_attr *la,
1244                             struct linkea_data *data)
1245 {
1246         int rc;
1247
1248         rc = mdo_declare_index_insert(env, p, mdo2fid(c), mdd_object_type(c),
1249                                       name->ln_name, handle);
1250         if (rc != 0)
1251                 return rc;
1252
1253         rc = mdo_declare_ref_add(env, c, handle);
1254         if (rc)
1255                 return rc;
1256
1257         la->la_valid = LA_CTIME | LA_MTIME;
1258         rc = mdo_declare_attr_set(env, p, la, handle);
1259         if (rc != 0)
1260                 return rc;
1261
1262         la->la_valid = LA_CTIME;
1263         rc = mdo_declare_attr_set(env, c, la, handle);
1264         if (rc)
1265                 return rc;
1266
1267         rc = mdd_declare_links_add(env, c, handle, data);
1268         if (rc)
1269                 return rc;
1270
1271         rc = mdd_declare_changelog_store(env, mdd, name, handle);
1272
1273         return rc;
1274 }
1275
1276 static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj,
1277                     struct md_object *src_obj, const struct lu_name *lname,
1278                     struct md_attr *ma)
1279 {
1280         const char *name = lname->ln_name;
1281         struct lu_attr    *la = &mdd_env_info(env)->mti_la_for_fix;
1282         struct mdd_object *mdd_tobj = md2mdd_obj(tgt_obj);
1283         struct mdd_object *mdd_sobj = md2mdd_obj(src_obj);
1284         struct lu_attr    *cattr = MDD_ENV_VAR(env, cattr);
1285         struct lu_attr    *tattr = MDD_ENV_VAR(env, tattr);
1286         struct mdd_device *mdd = mdo2mdd(src_obj);
1287         struct thandle *handle;
1288         struct linkea_data *ldata = &mdd_env_info(env)->mti_link_data;
1289         int rc;
1290         ENTRY;
1291
1292         rc = mdd_la_get(env, mdd_sobj, cattr, BYPASS_CAPA);
1293         if (rc != 0)
1294                 RETURN(rc);
1295
1296         rc = mdd_la_get(env, mdd_tobj, tattr, BYPASS_CAPA);
1297         if (rc != 0)
1298                 RETURN(rc);
1299
1300         handle = mdd_trans_create(env, mdd);
1301         if (IS_ERR(handle))
1302                 GOTO(out_pending, rc = PTR_ERR(handle));
1303
1304         memset(ldata, 0, sizeof(*ldata));
1305
1306         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
1307         la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
1308
1309         rc = mdd_declare_link(env, mdd, mdd_tobj, mdd_sobj, lname, handle,
1310                               la, ldata);
1311         if (rc)
1312                 GOTO(stop, rc);
1313
1314         rc = mdd_trans_start(env, mdd, handle);
1315         if (rc)
1316                 GOTO(stop, rc);
1317
1318         mdd_write_lock(env, mdd_sobj, MOR_TGT_CHILD);
1319         rc = mdd_link_sanity_check(env, mdd_tobj, tattr, lname, mdd_sobj,
1320                                    cattr);
1321         if (rc)
1322                 GOTO(out_unlock, rc);
1323
1324         rc = mdo_ref_add(env, mdd_sobj, handle);
1325         if (rc)
1326                 GOTO(out_unlock, rc);
1327
1328
1329         rc = __mdd_index_insert_only(env, mdd_tobj, mdo2fid(mdd_sobj),
1330                                      mdd_object_type(mdd_sobj), name, handle,
1331                                      mdd_object_capa(env, mdd_tobj));
1332         if (rc != 0) {
1333                 mdo_ref_del(env, mdd_sobj, handle);
1334                 GOTO(out_unlock, rc);
1335         }
1336
1337         la->la_valid = LA_CTIME | LA_MTIME;
1338         rc = mdd_update_time(env, mdd_tobj, tattr, la, handle);
1339         if (rc)
1340                 GOTO(out_unlock, rc);
1341
1342         la->la_valid = LA_CTIME;
1343         rc = mdd_update_time(env, mdd_sobj, cattr, la, handle);
1344         if (rc == 0) {
1345                 rc = mdd_linkea_prepare(env, mdd_sobj, NULL, NULL,
1346                                         mdo2fid(mdd_tobj), lname, 0, 0,
1347                                         ldata);
1348                 if (rc == 0)
1349                         mdd_links_add(env, mdd_sobj, mdo2fid(mdd_tobj),
1350                                       lname, handle, ldata, 0);
1351                 /* The failure of links_add should not cause the link
1352                  * failure, reset rc here */
1353                 rc = 0;
1354         }
1355         EXIT;
1356 out_unlock:
1357         mdd_write_unlock(env, mdd_sobj);
1358         if (rc == 0)
1359                 rc = mdd_changelog_ns_store(env, mdd, CL_HARDLINK, 0, mdd_sobj,
1360                                             mdd_tobj, lname, handle);
1361 stop:
1362         mdd_trans_stop(env, mdd, rc, handle);
1363
1364         if (ldata->ld_buf && ldata->ld_buf->lb_len > OBD_ALLOC_BIG)
1365                 /* if we vmalloced a large buffer drop it */
1366                 lu_buf_free(ldata->ld_buf);
1367 out_pending:
1368         return rc;
1369 }
1370
1371 static int mdd_mark_dead_object(const struct lu_env *env,
1372                                 struct mdd_object *obj, struct thandle *handle,
1373                                 bool declare)
1374 {
1375         struct lu_attr *attr = MDD_ENV_VAR(env, la_for_start);
1376         int rc;
1377
1378         if (!declare)
1379                 obj->mod_flags |= DEAD_OBJ;
1380
1381         if (!S_ISDIR(mdd_object_type(obj)))
1382                 return 0;
1383
1384         attr->la_valid = LA_FLAGS;
1385         attr->la_flags = LUSTRE_SLAVE_DEAD_FL;
1386
1387         if (declare)
1388                 rc = mdo_declare_attr_set(env, obj, attr, handle);
1389         else
1390                 rc = mdo_attr_set(env, obj, attr, handle,
1391                                   mdd_object_capa(env, obj));
1392
1393         return rc;
1394 }
1395
1396 static int mdd_declare_finish_unlink(const struct lu_env *env,
1397                                      struct mdd_object *obj,
1398                                      struct thandle *handle)
1399 {
1400         int     rc;
1401
1402         rc = mdd_mark_dead_object(env, obj, handle, true);
1403         if (rc != 0)
1404                 return rc;
1405
1406         rc = orph_declare_index_insert(env, obj, mdd_object_type(obj), handle);
1407         if (rc != 0)
1408                 return rc;
1409
1410         rc = mdo_declare_destroy(env, obj, handle);
1411         if (rc != 0)
1412                 return rc;
1413
1414         return mdd_declare_links_del(env, obj, handle);
1415 }
1416
1417 /* caller should take a lock before calling */
1418 int mdd_finish_unlink(const struct lu_env *env,
1419                       struct mdd_object *obj, struct md_attr *ma,
1420                       const struct mdd_object *pobj,
1421                       const struct lu_name *lname,
1422                       struct thandle *th)
1423 {
1424         int rc = 0;
1425         int is_dir = S_ISDIR(ma->ma_attr.la_mode);
1426         ENTRY;
1427
1428         LASSERT(mdd_write_locked(env, obj) != 0);
1429
1430         if (ma->ma_attr.la_nlink == 0 || is_dir) {
1431                 rc = mdd_mark_dead_object(env, obj, th, false);
1432                 if (rc != 0)
1433                         RETURN(rc);
1434
1435                 /* add new orphan and the object
1436                  * will be deleted during mdd_close() */
1437                 if (obj->mod_count) {
1438                         rc = __mdd_orphan_add(env, obj, th);
1439                         if (rc == 0)
1440                                 CDEBUG(D_HA, "Object "DFID" is inserted into "
1441                                         "orphan list, open count = %d\n",
1442                                         PFID(mdd_object_fid(obj)),
1443                                         obj->mod_count);
1444                         else
1445                                 CERROR("Object "DFID" fail to be an orphan, "
1446                                        "open count = %d, maybe cause failed "
1447                                        "open replay\n",
1448                                         PFID(mdd_object_fid(obj)),
1449                                         obj->mod_count);
1450                 } else {
1451                         rc = mdo_destroy(env, obj, th);
1452                 }
1453         } else if (!is_dir) {
1454                 /* old files may not have link ea; ignore errors */
1455                 mdd_links_del(env, obj, mdo2fid(pobj), lname, th);
1456         }
1457
1458         RETURN(rc);
1459 }
1460
1461 /*
1462  * pobj maybe NULL
1463  * has mdd_write_lock on cobj already, but not on pobj yet
1464  */
1465 int mdd_unlink_sanity_check(const struct lu_env *env, struct mdd_object *pobj,
1466                             const struct lu_attr *pattr,
1467                             struct mdd_object *cobj,
1468                             const struct lu_attr *cattr)
1469 {
1470         int rc;
1471         ENTRY;
1472
1473         rc = mdd_may_delete(env, pobj, pattr, cobj, cattr, NULL, 1, 1);
1474
1475         RETURN(rc);
1476 }
1477
1478 static int mdd_declare_unlink(const struct lu_env *env, struct mdd_device *mdd,
1479                               struct mdd_object *p, struct mdd_object *c,
1480                               const struct lu_name *name, struct md_attr *ma,
1481                               struct thandle *handle, int no_name)
1482 {
1483         struct lu_attr     *la = &mdd_env_info(env)->mti_la_for_fix;
1484         int rc;
1485
1486         if (likely(no_name == 0)) {
1487                 rc = mdo_declare_index_delete(env, p, name->ln_name, handle);
1488                 if (rc)
1489                         return rc;
1490         }
1491
1492         rc = mdo_declare_ref_del(env, p, handle);
1493         if (rc)
1494                 return rc;
1495
1496         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
1497         la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
1498         la->la_valid = LA_CTIME | LA_MTIME;
1499         rc = mdo_declare_attr_set(env, p, la, handle);
1500         if (rc)
1501                 return rc;
1502
1503         if (c != NULL) {
1504                 rc = mdo_declare_ref_del(env, c, handle);
1505                 if (rc)
1506                         return rc;
1507
1508                 rc = mdo_declare_ref_del(env, c, handle);
1509                 if (rc)
1510                         return rc;
1511
1512                 la->la_valid = LA_CTIME;
1513                 rc = mdo_declare_attr_set(env, c, la, handle);
1514                 if (rc)
1515                         return rc;
1516
1517                 rc = mdd_declare_finish_unlink(env, c, handle);
1518                 if (rc)
1519                         return rc;
1520
1521                 /* FIXME: need changelog for remove entry */
1522                 rc = mdd_declare_changelog_store(env, mdd, name, handle);
1523         }
1524
1525         return rc;
1526 }
1527
1528 /*
1529  * test if a file has an HSM archive
1530  * if HSM attributes are not found in ma update them from
1531  * HSM xattr
1532  */
1533 static bool mdd_hsm_archive_exists(const struct lu_env *env,
1534                                    struct mdd_object *obj,
1535                                    struct md_attr *ma)
1536 {
1537         ENTRY;
1538
1539         if (!(ma->ma_valid & MA_HSM)) {
1540                 /* no HSM MD provided, read xattr */
1541                 struct lu_buf   *hsm_buf;
1542                 const size_t     buflen = sizeof(struct hsm_attrs);
1543                 int              rc;
1544
1545                 hsm_buf = mdd_buf_get(env, NULL, 0);
1546                 lu_buf_alloc(hsm_buf, buflen);
1547                 rc = mdo_xattr_get(env, obj, hsm_buf, XATTR_NAME_HSM,
1548                                    mdd_object_capa(env, obj));
1549                 rc = lustre_buf2hsm(hsm_buf->lb_buf, rc, &ma->ma_hsm);
1550                 lu_buf_free(hsm_buf);
1551                 if (rc < 0)
1552                         RETURN(false);
1553
1554                 ma->ma_valid = MA_HSM;
1555         }
1556         if (ma->ma_hsm.mh_flags & HS_EXISTS)
1557                 RETURN(true);
1558         RETURN(false);
1559 }
1560
1561 /**
1562  * Delete name entry and the object.
1563  * Note: no_name == 1 means it only destory the object, i.e. name_entry
1564  * does not exist for this object, and it could only happen during resending
1565  * of remote unlink. see the comments in mdt_reint_unlink. Unfortunately, lname
1566  * is also needed in this case(needed by changelog), so we have to add another
1567  * parameter(no_name)here. XXX: this is only needed in DNE phase I, on Phase II,
1568  * the ENOENT failure should be able to be fixed by redo mechanism.
1569  */
1570 static int mdd_unlink(const struct lu_env *env, struct md_object *pobj,
1571                       struct md_object *cobj, const struct lu_name *lname,
1572                       struct md_attr *ma, int no_name)
1573 {
1574         const char *name = lname->ln_name;
1575         struct lu_attr *pattr = MDD_ENV_VAR(env, pattr);
1576         struct lu_attr *cattr = MDD_ENV_VAR(env, cattr);
1577         struct lu_attr *la = &mdd_env_info(env)->mti_la_for_fix;
1578         struct mdd_object *mdd_pobj = md2mdd_obj(pobj);
1579         struct mdd_object *mdd_cobj = NULL;
1580         struct mdd_device *mdd = mdo2mdd(pobj);
1581         struct thandle    *handle;
1582         int rc, is_dir = 0;
1583         ENTRY;
1584
1585         /* cobj == NULL means only delete name entry */
1586         if (likely(cobj != NULL)) {
1587                 mdd_cobj = md2mdd_obj(cobj);
1588                 if (mdd_object_exists(mdd_cobj) == 0)
1589                         RETURN(-ENOENT);
1590         }
1591
1592         rc = mdd_la_get(env, mdd_pobj, pattr, BYPASS_CAPA);
1593         if (rc)
1594                 RETURN(rc);
1595
1596         if (likely(mdd_cobj != NULL)) {
1597                 /* fetch cattr */
1598                 rc = mdd_la_get(env, mdd_cobj, cattr, BYPASS_CAPA);
1599                 if (rc)
1600                         RETURN(rc);
1601
1602                 is_dir = S_ISDIR(cattr->la_mode);
1603         }
1604
1605         rc = mdd_unlink_sanity_check(env, mdd_pobj, pattr, mdd_cobj, cattr);
1606         if (rc)
1607                 RETURN(rc);
1608
1609         handle = mdd_trans_create(env, mdd);
1610         if (IS_ERR(handle))
1611                 RETURN(PTR_ERR(handle));
1612
1613         rc = mdd_declare_unlink(env, mdd, mdd_pobj, mdd_cobj,
1614                                 lname, ma, handle, no_name);
1615         if (rc)
1616                 GOTO(stop, rc);
1617
1618         rc = mdd_trans_start(env, mdd, handle);
1619         if (rc)
1620                 GOTO(stop, rc);
1621
1622         if (likely(mdd_cobj != NULL))
1623                 mdd_write_lock(env, mdd_cobj, MOR_TGT_CHILD);
1624
1625         if (likely(no_name == 0)) {
1626                 rc = __mdd_index_delete(env, mdd_pobj, name, is_dir, handle,
1627                                         mdd_object_capa(env, mdd_pobj));
1628                 if (rc)
1629                         GOTO(cleanup, rc);
1630         }
1631
1632         if (likely(mdd_cobj != NULL)) {
1633                 rc = mdo_ref_del(env, mdd_cobj, handle);
1634                 if (rc != 0) {
1635                         __mdd_index_insert_only(env, mdd_pobj,
1636                                                 mdo2fid(mdd_cobj),
1637                                                 mdd_object_type(mdd_cobj),
1638                                                 name, handle,
1639                                                 mdd_object_capa(env, mdd_pobj));
1640                         GOTO(cleanup, rc);
1641                 }
1642
1643                 if (is_dir)
1644                         /* unlink dot */
1645                         mdo_ref_del(env, mdd_cobj, handle);
1646
1647                 /* fetch updated nlink */
1648                 rc = mdd_la_get(env, mdd_cobj, cattr, BYPASS_CAPA);
1649                 if (rc)
1650                         GOTO(cleanup, rc);
1651         }
1652
1653         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
1654         la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
1655
1656         la->la_valid = LA_CTIME | LA_MTIME;
1657         rc = mdd_update_time(env, mdd_pobj, pattr, la, handle);
1658         if (rc)
1659                 GOTO(cleanup, rc);
1660
1661         /* Enough for only unlink the entry */
1662         if (unlikely(mdd_cobj == NULL))
1663                 GOTO(stop, rc);
1664
1665         if (cattr->la_nlink > 0 || mdd_cobj->mod_count > 0) {
1666                 /* update ctime of an unlinked file only if it is still
1667                  * opened or a link still exists */
1668                 la->la_valid = LA_CTIME;
1669                 rc = mdd_update_time(env, mdd_cobj, cattr, la, handle);
1670                 if (rc)
1671                         GOTO(cleanup, rc);
1672         }
1673
1674         /* XXX: this transfer to ma will be removed with LOD/OSP */
1675         ma->ma_attr = *cattr;
1676         ma->ma_valid |= MA_INODE;
1677         rc = mdd_finish_unlink(env, mdd_cobj, ma, mdd_pobj, lname, handle);
1678
1679         /* fetch updated nlink */
1680         if (rc == 0)
1681                 rc = mdd_la_get(env, mdd_cobj, cattr, BYPASS_CAPA);
1682
1683         /* if object is removed then we can't get its attrs, use last get */
1684         if (cattr->la_nlink == 0) {
1685                 ma->ma_attr = *cattr;
1686                 ma->ma_valid |= MA_INODE;
1687         }
1688         EXIT;
1689 cleanup:
1690         mdd_write_unlock(env, mdd_cobj);
1691         if (rc == 0) {
1692                 int cl_flags = 0;
1693
1694                 if (cattr->la_nlink == 0) {
1695                         cl_flags |= CLF_UNLINK_LAST;
1696                         /* search for an existing archive */
1697                         if (mdd_hsm_archive_exists(env, mdd_cobj, ma))
1698                                 cl_flags |= CLF_UNLINK_HSM_EXISTS;
1699                 }
1700
1701                 rc = mdd_changelog_ns_store(env, mdd,
1702                         is_dir ? CL_RMDIR : CL_UNLINK, cl_flags,
1703                         mdd_cobj, mdd_pobj, lname, handle);
1704         }
1705
1706 stop:
1707         mdd_trans_stop(env, mdd, rc, handle);
1708
1709         return rc;
1710 }
1711
1712 /*
1713  * The permission has been checked when obj created, no need check again.
1714  */
1715 static int mdd_cd_sanity_check(const struct lu_env *env,
1716                                struct mdd_object *obj)
1717 {
1718         ENTRY;
1719
1720         /* EEXIST check */
1721         if (!obj || mdd_is_dead_obj(obj))
1722                 RETURN(-ENOENT);
1723
1724         RETURN(0);
1725 }
1726
1727 static int mdd_create_data(const struct lu_env *env, struct md_object *pobj,
1728                            struct md_object *cobj, const struct md_op_spec *spec,
1729                            struct md_attr *ma)
1730 {
1731         struct mdd_device *mdd = mdo2mdd(cobj);
1732         struct mdd_object *mdd_pobj = md2mdd_obj(pobj);
1733         struct mdd_object *son = md2mdd_obj(cobj);
1734         struct thandle    *handle;
1735         const struct lu_buf *buf;
1736         struct lu_attr    *attr = MDD_ENV_VAR(env, cattr);
1737         struct dt_allocation_hint *hint = &mdd_env_info(env)->mti_hint;
1738         int                rc;
1739         ENTRY;
1740
1741         rc = mdd_cd_sanity_check(env, son);
1742         if (rc)
1743                 RETURN(rc);
1744
1745         if (!md_should_create(spec->sp_cr_flags))
1746                 RETURN(0);
1747
1748         /*
1749          * there are following use cases for this function:
1750          * 1) late striping - file was created with MDS_OPEN_DELAY_CREATE
1751          *    striping can be specified or not
1752          * 2) CMD?
1753          */
1754         rc = mdd_la_get(env, son, attr, BYPASS_CAPA);
1755         if (rc)
1756                 RETURN(rc);
1757
1758         /* calling ->ah_make_hint() is used to transfer information from parent */
1759         mdd_object_make_hint(env, mdd_pobj, son, attr, spec, hint);
1760
1761         handle = mdd_trans_create(env, mdd);
1762         if (IS_ERR(handle))
1763                 GOTO(out_free, rc = PTR_ERR(handle));
1764
1765         /*
1766          * XXX: Setting the lov ea is not locked but setting the attr is locked?
1767          * Should this be fixed?
1768          */
1769         CDEBUG(D_OTHER, "ea %p/%u, cr_flags "LPO64", no_create %u\n",
1770                spec->u.sp_ea.eadata, spec->u.sp_ea.eadatalen,
1771                spec->sp_cr_flags, spec->no_create);
1772
1773         if (spec->no_create || (spec->sp_cr_flags & MDS_OPEN_HAS_EA)) {
1774                 buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
1775                                         spec->u.sp_ea.eadatalen);
1776         } else {
1777                 buf = &LU_BUF_NULL;
1778         }
1779
1780         rc = dt_declare_xattr_set(env, mdd_object_child(son), buf,
1781                                   XATTR_NAME_LOV, 0, handle);
1782         if (rc)
1783                 GOTO(stop, rc);
1784
1785         rc = mdd_declare_changelog_store(env, mdd, NULL, handle);
1786         if (rc)
1787                 GOTO(stop, rc);
1788
1789         rc = mdd_trans_start(env, mdd, handle);
1790         if (rc)
1791                 GOTO(stop, rc);
1792
1793         rc = dt_xattr_set(env, mdd_object_child(son), buf, XATTR_NAME_LOV,
1794                           0, handle, mdd_object_capa(env, son));
1795
1796         if (rc)
1797                 GOTO(stop, rc);
1798
1799         rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, son, handle);
1800
1801 stop:
1802         mdd_trans_stop(env, mdd, rc, handle);
1803 out_free:
1804         RETURN(rc);
1805 }
1806
1807 static int mdd_declare_object_initialize(const struct lu_env *env,
1808                                          struct mdd_object *parent,
1809                                          struct mdd_object *child,
1810                                          struct lu_attr *attr,
1811                                          struct thandle *handle)
1812 {
1813         int rc;
1814         ENTRY;
1815
1816         /*
1817          * inode mode has been set in creation time, and it's based on umask,
1818          * la_mode and acl, don't set here again! (which will go wrong
1819          * because below function doesn't consider umask).
1820          * I'd suggest set all object attributes in creation time, see above.
1821          */
1822         LASSERT(attr->la_valid & (LA_MODE | LA_TYPE));
1823         attr->la_valid &= ~(LA_MODE | LA_TYPE);
1824         rc = mdo_declare_attr_set(env, child, attr, handle);
1825         attr->la_valid |= LA_MODE | LA_TYPE;
1826         if (rc != 0 || !S_ISDIR(attr->la_mode))
1827                 RETURN(rc);
1828
1829         rc = mdo_declare_index_insert(env, child, mdo2fid(child), S_IFDIR,
1830                                       dot, handle);
1831         if (rc != 0)
1832                 RETURN(rc);
1833
1834         rc = mdo_declare_ref_add(env, child, handle);
1835         if (rc != 0)
1836                 RETURN(rc);
1837
1838         rc = mdo_declare_index_insert(env, child, mdo2fid(parent), S_IFDIR,
1839                                       dotdot, handle);
1840
1841         RETURN(rc);
1842 }
1843
1844 static int mdd_object_initialize(const struct lu_env *env,
1845                                  const struct lu_fid *pfid,
1846                                  struct mdd_object *child,
1847                                  struct lu_attr *attr, struct thandle *handle,
1848                                  const struct md_op_spec *spec)
1849 {
1850         int rc;
1851         ENTRY;
1852
1853         /*
1854          * Update attributes for child.
1855          *
1856          * FIXME:
1857          *  (1) the valid bits should be converted between Lustre and Linux;
1858          *  (2) maybe, the child attributes should be set in OSD when creation.
1859          */
1860
1861         rc = mdd_attr_set_internal(env, child, attr, handle, 0);
1862         /* arguments are supposed to stay the same */
1863         if (S_ISDIR(attr->la_mode)) {
1864                 /* Add "." and ".." for newly created dir */
1865                 mdo_ref_add(env, child, handle);
1866                 rc = __mdd_index_insert_only(env, child, mdo2fid(child),
1867                                              S_IFDIR, dot, handle, BYPASS_CAPA);
1868                 if (rc == 0)
1869                         rc = __mdd_index_insert_only(env, child, pfid, S_IFDIR,
1870                                                      dotdot, handle,
1871                                                      BYPASS_CAPA);
1872                 if (rc != 0)
1873                         mdo_ref_del(env, child, handle);
1874         }
1875
1876         RETURN(rc);
1877 }
1878
1879 /**
1880  * This function checks whether it can create a file/dir under the
1881  * directory(@pobj). The directory(@pobj) is not being locked by
1882  * mdd lock.
1883  *
1884  * \param[in] env       execution environment
1885  * \param[in] pobj      the directory to create files
1886  * \param[in] pattr     the attributes of the directory
1887  * \param[in] lname     the name of the created file/dir
1888  * \param[in] cattr     the attributes of the file/dir
1889  * \param[in] spec      create specification
1890  *
1891  * \retval              = 0 it is allowed to create file/dir under
1892  *                      the directory
1893  * \retval              negative error not allowed to create file/dir
1894  *                      under the directory
1895  */
1896 static int mdd_create_sanity_check(const struct lu_env *env,
1897                                    struct md_object *pobj,
1898                                    const struct lu_attr *pattr,
1899                                    const struct lu_name *lname,
1900                                    struct lu_attr *cattr,
1901                                    struct md_op_spec *spec)
1902 {
1903         struct mdd_thread_info *info = mdd_env_info(env);
1904         struct lu_fid     *fid       = &info->mti_fid;
1905         struct mdd_object *obj       = md2mdd_obj(pobj);
1906         struct mdd_device *m         = mdo2mdd(pobj);
1907         bool            check_perm = true;
1908         int rc;
1909         ENTRY;
1910
1911         /* EEXIST check */
1912         if (mdd_is_dead_obj(obj))
1913                 RETURN(-ENOENT);
1914
1915         /*
1916          * In some cases this lookup is not needed - we know before if name
1917          * exists or not because MDT performs lookup for it.
1918          * name length check is done in lookup.
1919          */
1920         if (spec->sp_cr_lookup) {
1921                 /*
1922                  * Check if the name already exist, though it will be checked in
1923                  * _index_insert also, for avoiding rolling back if exists
1924                  * _index_insert.
1925                  */
1926                 rc = __mdd_lookup(env, pobj, pattr, lname, fid,
1927                                   MAY_WRITE | MAY_EXEC);
1928                 if (rc != -ENOENT)
1929                         RETURN(rc ? : -EEXIST);
1930
1931                 /* Permission is already being checked in mdd_lookup */
1932                 check_perm = false;
1933         }
1934
1935         rc = mdd_may_create(env, obj, pattr, NULL, check_perm);
1936         if (rc != 0)
1937                 RETURN(rc);
1938
1939         /* sgid check */
1940         if (pattr->la_mode & S_ISGID) {
1941                 cattr->la_gid = pattr->la_gid;
1942                 if (S_ISDIR(cattr->la_mode)) {
1943                         cattr->la_mode |= S_ISGID;
1944                         cattr->la_valid |= LA_MODE;
1945                 }
1946         }
1947
1948         rc = mdd_name_check(m, lname);
1949         if (rc < 0)
1950                 RETURN(rc);
1951
1952         switch (cattr->la_mode & S_IFMT) {
1953         case S_IFLNK: {
1954                 unsigned int symlen = strlen(spec->u.sp_symname) + 1;
1955
1956                 if (symlen > (1 << m->mdd_dt_conf.ddp_block_shift))
1957                         RETURN(-ENAMETOOLONG);
1958                 else
1959                         RETURN(0);
1960         }
1961         case S_IFDIR:
1962         case S_IFREG:
1963         case S_IFCHR:
1964         case S_IFBLK:
1965         case S_IFIFO:
1966         case S_IFSOCK:
1967                 rc = 0;
1968                 break;
1969         default:
1970                 rc = -EINVAL;
1971                 break;
1972         }
1973         RETURN(rc);
1974 }
1975
1976 static int mdd_declare_object_create(const struct lu_env *env,
1977                                      struct mdd_device *mdd,
1978                                      struct mdd_object *p, struct mdd_object *c,
1979                                      struct lu_attr *attr,
1980                                      struct thandle *handle,
1981                                      const struct md_op_spec *spec,
1982                                      struct lu_buf *def_acl_buf,
1983                                      struct lu_buf *acl_buf,
1984                                      struct dt_allocation_hint *hint)
1985 {
1986         int rc;
1987
1988         rc = mdd_declare_object_create_internal(env, p, c, attr, handle, spec,
1989                                                 hint);
1990         if (rc)
1991                 GOTO(out, rc);
1992
1993 #ifdef CONFIG_FS_POSIX_ACL
1994         if (def_acl_buf->lb_len > 0 && S_ISDIR(attr->la_mode)) {
1995                 /* if dir, then can inherit default ACl */
1996                 rc = mdo_declare_xattr_set(env, c, def_acl_buf,
1997                                            XATTR_NAME_ACL_DEFAULT,
1998                                            0, handle);
1999                 if (rc)
2000                         GOTO(out, rc);
2001         }
2002
2003         if (acl_buf->lb_len > 0) {
2004                 rc = mdo_declare_attr_set(env, c, attr, handle);
2005                 if (rc)
2006                         GOTO(out, rc);
2007
2008                 rc = mdo_declare_xattr_set(env, c, acl_buf,
2009                                            XATTR_NAME_ACL_ACCESS, 0, handle);
2010                 if (rc)
2011                         GOTO(out, rc);
2012         }
2013 #endif
2014         rc = mdd_declare_object_initialize(env, p, c, attr, handle);
2015         if (rc)
2016                 GOTO(out, rc);
2017
2018         /* replay case, create LOV EA from client data */
2019         if (spec->no_create ||
2020             (spec->sp_cr_flags & MDS_OPEN_HAS_EA && S_ISREG(attr->la_mode))) {
2021                 const struct lu_buf *buf;
2022
2023                 buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
2024                                         spec->u.sp_ea.eadatalen);
2025                 rc = mdo_declare_xattr_set(env, c, buf, XATTR_NAME_LOV, 0,
2026                                            handle);
2027                 if (rc)
2028                         GOTO(out, rc);
2029         }
2030
2031         if (S_ISLNK(attr->la_mode)) {
2032                 const char *target_name = spec->u.sp_symname;
2033                 int sym_len = strlen(target_name);
2034                 const struct lu_buf *buf;
2035
2036                 buf = mdd_buf_get_const(env, target_name, sym_len);
2037                 rc = dt_declare_record_write(env, mdd_object_child(c),
2038                                              buf, 0, handle);
2039                 if (rc)
2040                         GOTO(out, rc);
2041         }
2042 out:
2043         return rc;
2044 }
2045
2046 static int mdd_declare_create(const struct lu_env *env, struct mdd_device *mdd,
2047                               struct mdd_object *p, struct mdd_object *c,
2048                               const struct lu_name *name,
2049                               struct lu_attr *attr,
2050                               struct thandle *handle,
2051                               const struct md_op_spec *spec,
2052                               struct linkea_data *ldata,
2053                               struct lu_buf *def_acl_buf,
2054                               struct lu_buf *acl_buf,
2055                               struct dt_allocation_hint *hint)
2056 {
2057         int rc;
2058
2059         rc = mdd_declare_object_create(env, mdd, p, c, attr, handle, spec,
2060                                        def_acl_buf, acl_buf, hint);
2061         if (rc)
2062                 GOTO(out, rc);
2063
2064         if (S_ISDIR(attr->la_mode)) {
2065                 rc = mdo_declare_ref_add(env, p, handle);
2066                 if (rc)
2067                         GOTO(out, rc);
2068         }
2069
2070         if (unlikely(spec->sp_cr_flags & MDS_OPEN_VOLATILE)) {
2071                 rc = orph_declare_index_insert(env, c, attr->la_mode, handle);
2072                 if (rc)
2073                         GOTO(out, rc);
2074         } else {
2075                 struct lu_attr  *la = &mdd_env_info(env)->mti_la_for_fix;
2076
2077                 rc = mdo_declare_index_insert(env, p, mdo2fid(c), attr->la_mode,
2078                                               name->ln_name, handle);
2079                 if (rc != 0)
2080                         return rc;
2081
2082                 rc = mdd_declare_links_add(env, c, handle, ldata);
2083                 if (rc)
2084                         return rc;
2085
2086                 *la = *attr;
2087                 la->la_valid = LA_CTIME | LA_MTIME;
2088                 rc = mdo_declare_attr_set(env, p, la, handle);
2089                 if (rc)
2090                         return rc;
2091
2092                 rc = mdd_declare_changelog_store(env, mdd, name, handle);
2093                 if (rc)
2094                         return rc;
2095         }
2096
2097         /* XXX: For remote create, it should indicate the remote RPC
2098          * will be sent after local transaction is finished, which
2099          * is not very nice, but it will be removed once we fully support
2100          * async update */
2101         if (mdd_object_remote(p) && handle->th_update != NULL)
2102                 handle->th_update->tu_sent_after_local_trans = 1;
2103 out:
2104         return rc;
2105 }
2106
2107 static int mdd_acl_init(const struct lu_env *env, struct mdd_object *pobj,
2108                         struct lu_attr *la, struct lu_buf *def_acl_buf,
2109                         struct lu_buf *acl_buf)
2110 {
2111         int     rc;
2112         ENTRY;
2113
2114         if (S_ISLNK(la->la_mode)) {
2115                 acl_buf->lb_len = 0;
2116                 def_acl_buf->lb_len = 0;
2117                 RETURN(0);
2118         }
2119
2120         mdd_read_lock(env, pobj, MOR_TGT_PARENT);
2121         rc = mdo_xattr_get(env, pobj, def_acl_buf,
2122                            XATTR_NAME_ACL_DEFAULT, BYPASS_CAPA);
2123         mdd_read_unlock(env, pobj);
2124         if (rc > 0) {
2125                 /* If there are default ACL, fix mode/ACL by default ACL */
2126                 def_acl_buf->lb_len = rc;
2127                 LASSERT(def_acl_buf->lb_len <= acl_buf->lb_len);
2128                 memcpy(acl_buf->lb_buf, def_acl_buf->lb_buf, rc);
2129                 acl_buf->lb_len = rc;
2130                 rc = __mdd_fix_mode_acl(env, acl_buf, &la->la_mode);
2131                 if (rc < 0)
2132                         RETURN(rc);
2133         } else if (rc == -ENODATA || rc == -EOPNOTSUPP) {
2134                 /* If there are no default ACL, fix mode by mask */
2135                 struct lu_ucred *uc = lu_ucred(env);
2136
2137                 /* The create triggered by MDT internal events, such as
2138                  * LFSCK reset, will not contain valid "uc". */
2139                 if (unlikely(uc != NULL))
2140                         la->la_mode &= ~uc->uc_umask;
2141                 rc = 0;
2142                 acl_buf->lb_len = 0;
2143                 def_acl_buf->lb_len = 0;
2144         }
2145
2146         RETURN(rc);
2147 }
2148
2149 /**
2150  * Create a metadata object and initialize it, set acl, xattr.
2151  **/
2152 static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj,
2153                              struct mdd_object *son, struct lu_attr *attr,
2154                              struct md_op_spec *spec, struct lu_buf *acl_buf,
2155                              struct lu_buf *def_acl_buf,
2156                              struct dt_allocation_hint *hint,
2157                              struct thandle *handle)
2158 {
2159         int                     rc;
2160
2161         mdd_write_lock(env, son, MOR_TGT_CHILD);
2162         rc = mdd_object_create_internal(env, NULL, son, attr, handle, spec,
2163                                         hint);
2164         if (rc)
2165                 GOTO(unlock, rc);
2166
2167         /* Note: In DNE phase I, for striped dir, though sub-stripes will be
2168          * created in declare phase, they also needs to be added to master
2169          * object as sub-directory entry. So it has to initialize the master
2170          * object, then set dir striped EA.(in mdo_xattr_set) */
2171         rc = mdd_object_initialize(env, mdo2fid(pobj), son, attr, handle,
2172                                    spec);
2173         if (rc != 0)
2174                 GOTO(err_destroy, rc);
2175
2176         /*
2177          * in case of replay we just set LOVEA provided by the client
2178          * XXX: I think it would be interesting to try "old" way where
2179          *      MDT calls this xattr_set(LOV) in a different transaction.
2180          *      probably this way we code can be made better.
2181          */
2182
2183         /* During creation, there are only a few cases we need do xattr_set to
2184          * create stripes.
2185          * 1. regular file: see comments above.
2186          * 2. create striped directory with provided stripeEA.
2187          * 3. create striped directory because inherit default layout from the
2188          * parent. */
2189         if (spec->no_create ||
2190             (S_ISREG(attr->la_mode) && spec->sp_cr_flags & MDS_OPEN_HAS_EA) ||
2191             S_ISDIR(attr->la_mode)) {
2192                 const struct lu_buf *buf;
2193
2194                 buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
2195                                         spec->u.sp_ea.eadatalen);
2196                 rc = mdo_xattr_set(env, son, buf,
2197                                    S_ISDIR(attr->la_mode) ? XATTR_NAME_LMV :
2198                                                             XATTR_NAME_LOV, 0,
2199                                    handle, BYPASS_CAPA);
2200                 if (rc != 0)
2201                         GOTO(err_destroy, rc);
2202         }
2203
2204 #ifdef CONFIG_FS_POSIX_ACL
2205         if (def_acl_buf != NULL && def_acl_buf->lb_len > 0 &&
2206             S_ISDIR(attr->la_mode)) {
2207                 /* set default acl */
2208                 rc = mdo_xattr_set(env, son, def_acl_buf,
2209                                    XATTR_NAME_ACL_DEFAULT, 0,
2210                                    handle, BYPASS_CAPA);
2211                 if (rc)
2212                         GOTO(err_destroy, rc);
2213         }
2214         /* set its own acl */
2215         if (acl_buf != NULL && acl_buf->lb_len > 0) {
2216                 rc = mdo_xattr_set(env, son, acl_buf,
2217                                    XATTR_NAME_ACL_ACCESS,
2218                                    0, handle, BYPASS_CAPA);
2219                 if (rc)
2220                         GOTO(err_destroy, rc);
2221         }
2222 #endif
2223
2224         if (S_ISLNK(attr->la_mode)) {
2225                 struct lu_ucred  *uc = lu_ucred_assert(env);
2226                 struct dt_object *dt = mdd_object_child(son);
2227                 const char *target_name = spec->u.sp_symname;
2228                 int sym_len = strlen(target_name);
2229                 const struct lu_buf *buf;
2230                 loff_t pos = 0;
2231
2232                 buf = mdd_buf_get_const(env, target_name, sym_len);
2233                 rc = dt->do_body_ops->dbo_write(env, dt, buf, &pos, handle,
2234                                                 mdd_object_capa(env, son),
2235                                                 uc->uc_cap &
2236                                                 CFS_CAP_SYS_RESOURCE_MASK);
2237
2238                 if (rc == sym_len)
2239                         rc = 0;
2240                 else
2241                         GOTO(err_initlized, rc = -EFAULT);
2242         }
2243
2244 err_initlized:
2245         if (unlikely(rc != 0)) {
2246                 int rc2;
2247                 if (S_ISDIR(attr->la_mode)) {
2248                         /* Drop the reference, no need to delete "."/"..",
2249                          * because the object to be destroied directly. */
2250                         rc2 = mdo_ref_del(env, son, handle);
2251                         if (rc2 != 0)
2252                                 GOTO(unlock, rc);
2253                 }
2254                 rc2 = mdo_ref_del(env, son, handle);
2255                 if (rc2 != 0)
2256                         GOTO(unlock, rc);
2257 err_destroy:
2258                 mdo_destroy(env, son, handle);
2259         }
2260 unlock:
2261         mdd_write_unlock(env, son);
2262         RETURN(rc);
2263 }
2264
2265 /*
2266  * Create object and insert it into namespace.
2267  */
2268 static int mdd_create(const struct lu_env *env, struct md_object *pobj,
2269                       const struct lu_name *lname, struct md_object *child,
2270                       struct md_op_spec *spec, struct md_attr* ma)
2271 {
2272         struct mdd_thread_info  *info = mdd_env_info(env);
2273         struct lu_attr          *la = &info->mti_la_for_fix;
2274         struct mdd_object       *mdd_pobj = md2mdd_obj(pobj);
2275         struct mdd_object       *son = md2mdd_obj(child);
2276         struct mdd_device       *mdd = mdo2mdd(pobj);
2277         struct lu_attr          *attr = &ma->ma_attr;
2278         struct thandle          *handle;
2279         struct lu_attr          *pattr = &info->mti_pattr;
2280         struct lu_buf           acl_buf;
2281         struct lu_buf           def_acl_buf;
2282         struct linkea_data      *ldata = &info->mti_link_data;
2283         const char              *name = lname->ln_name;
2284         struct dt_allocation_hint *hint = &mdd_env_info(env)->mti_hint;
2285         int                      rc;
2286         int                      rc2;
2287         ENTRY;
2288
2289         /*
2290          * Two operations have to be performed:
2291          *
2292          *  - an allocation of a new object (->do_create()), and
2293          *
2294          *  - an insertion into a parent index (->dio_insert()).
2295          *
2296          * Due to locking, operation order is not important, when both are
2297          * successful, *but* error handling cases are quite different:
2298          *
2299          *  - if insertion is done first, and following object creation fails,
2300          *  insertion has to be rolled back, but this operation might fail
2301          *  also leaving us with dangling index entry.
2302          *
2303          *  - if creation is done first, is has to be undone if insertion
2304          *  fails, leaving us with leaked space, which is neither good, nor
2305          *  fatal.
2306          *
2307          * It seems that creation-first is simplest solution, but it is
2308          * sub-optimal in the frequent
2309          *
2310          *         $ mkdir foo
2311          *         $ mkdir foo
2312          *
2313          * case, because second mkdir is bound to create object, only to
2314          * destroy it immediately.
2315          *
2316          * To avoid this follow local file systems that do double lookup:
2317          *
2318          *     0. lookup -> -EEXIST (mdd_create_sanity_check())
2319          *
2320          *     1. create            (mdd_object_create_internal())
2321          *
2322          *     2. insert            (__mdd_index_insert(), lookup again)
2323          */
2324
2325         rc = mdd_la_get(env, mdd_pobj, pattr, BYPASS_CAPA);
2326         if (rc != 0)
2327                 RETURN(rc);
2328
2329         /* Sanity checks before big job. */
2330         rc = mdd_create_sanity_check(env, pobj, pattr, lname, attr, spec);
2331         if (rc)
2332                 RETURN(rc);
2333
2334         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_DQACQ_NET))
2335                 GOTO(out_free, rc = -EINPROGRESS);
2336
2337         handle = mdd_trans_create(env, mdd);
2338         if (IS_ERR(handle))
2339                 GOTO(out_free, rc = PTR_ERR(handle));
2340
2341         acl_buf.lb_buf = info->mti_xattr_buf;
2342         acl_buf.lb_len = sizeof(info->mti_xattr_buf);
2343         def_acl_buf.lb_buf = info->mti_key;
2344         def_acl_buf.lb_len = sizeof(info->mti_key);
2345         rc = mdd_acl_init(env, mdd_pobj, attr, &def_acl_buf, &acl_buf);
2346         if (rc < 0)
2347                 GOTO(out_stop, rc);
2348
2349         mdd_object_make_hint(env, mdd_pobj, son, attr, spec, hint);
2350
2351         memset(ldata, 0, sizeof(*ldata));
2352         rc = mdd_linkea_prepare(env, son, NULL, NULL,
2353                                 mdd_object_fid(mdd_pobj),
2354                                 lname, 1, 0, ldata);
2355
2356         rc = mdd_declare_create(env, mdd, mdd_pobj, son, lname, attr,
2357                                 handle, spec, ldata, &def_acl_buf, &acl_buf,
2358                                 hint);
2359         if (rc)
2360                 GOTO(out_stop, rc);
2361
2362         rc = mdd_trans_start(env, mdd, handle);
2363         if (rc)
2364                 GOTO(out_stop, rc);
2365
2366         rc = mdd_object_create(env, mdd_pobj, son, attr, spec, &acl_buf,
2367                                &def_acl_buf, hint, handle);
2368         if (rc != 0)
2369                 GOTO(out_stop, rc);
2370
2371         if (unlikely(spec->sp_cr_flags & MDS_OPEN_VOLATILE)) {
2372                 mdd_write_lock(env, son, MOR_TGT_CHILD);
2373                 rc = __mdd_orphan_add(env, son, handle);
2374                 GOTO(out_volatile, rc);
2375         } else {
2376                 rc = __mdd_index_insert(env, mdd_pobj, mdo2fid(son),
2377                                         attr->la_mode, name, handle,
2378                                         mdd_object_capa(env, mdd_pobj));
2379                 if (rc != 0)
2380                         GOTO(err_created, rc);
2381
2382                 mdd_links_add(env, son, mdo2fid(mdd_pobj), lname, handle,
2383                               ldata, 1);
2384
2385                 /* update parent directory mtime/ctime */
2386                 *la = *attr;
2387                 la->la_valid = LA_CTIME | LA_MTIME;
2388                 rc = mdd_update_time(env, mdd_pobj, pattr, la, handle);
2389                 if (rc)
2390                         GOTO(err_insert, rc);
2391         }
2392
2393         EXIT;
2394 err_insert:
2395         if (rc != 0) {
2396                 int rc2;
2397
2398                 if (spec->sp_cr_flags & MDS_OPEN_VOLATILE)
2399                         rc2 = __mdd_orphan_del(env, son, handle);
2400                 else
2401                         rc2 = __mdd_index_delete(env, mdd_pobj, name,
2402                                                  S_ISDIR(attr->la_mode),
2403                                                  handle, BYPASS_CAPA);
2404                 if (rc2 != 0)
2405                         goto out_stop;
2406
2407 err_created:
2408                 mdd_write_lock(env, son, MOR_TGT_CHILD);
2409                 if (S_ISDIR(attr->la_mode)) {
2410                         /* Drop the reference, no need to delete "."/"..",
2411                          * because the object is to be destroyed directly. */
2412                         rc2 = mdo_ref_del(env, son, handle);
2413                         if (rc2 != 0) {
2414                                 mdd_write_unlock(env, son);
2415                                 goto out_stop;
2416                         }
2417                 }
2418 out_volatile:
2419                 /* For volatile files drop one link immediately, since there is
2420                  * no filename in the namespace, and save any error returned. */
2421                 rc2 = mdo_ref_del(env, son, handle);
2422                 if (rc2 != 0) {
2423                         mdd_write_unlock(env, son);
2424                         if (unlikely(rc == 0))
2425                                 rc = rc2;
2426                         goto out_stop;
2427                 }
2428
2429                 /* Don't destroy the volatile object on success */
2430                 if (likely(rc != 0))
2431                         mdo_destroy(env, son, handle);
2432                 mdd_write_unlock(env, son);
2433         }
2434
2435         if (rc == 0 && fid_is_namespace_visible(mdo2fid(son)) &&
2436             likely((spec->sp_cr_flags & MDS_OPEN_VOLATILE) == 0))
2437                 rc = mdd_changelog_ns_store(env, mdd,
2438                                 S_ISDIR(attr->la_mode) ? CL_MKDIR :
2439                                 S_ISREG(attr->la_mode) ? CL_CREATE :
2440                                 S_ISLNK(attr->la_mode) ? CL_SOFTLINK : CL_MKNOD,
2441                                 0, son, mdd_pobj, lname, handle);
2442 out_stop:
2443         rc2 = mdd_trans_stop(env, mdd, rc, handle);
2444         if (rc == 0)
2445                 rc = rc2;
2446 out_free:
2447         if (ldata->ld_buf && ldata->ld_buf->lb_len > OBD_ALLOC_BIG)
2448                 /* if we vmalloced a large buffer drop it */
2449                 lu_buf_free(ldata->ld_buf);
2450
2451         /* The child object shouldn't be cached anymore */
2452         if (rc)
2453                 set_bit(LU_OBJECT_HEARD_BANSHEE,
2454                         &child->mo_lu.lo_header->loh_flags);
2455         return rc;
2456 }
2457
2458 /*
2459  * Get locks on parents in proper order
2460  * RETURN: < 0 - error, rename_order if successful
2461  */
2462 enum rename_order {
2463         MDD_RN_SAME,
2464         MDD_RN_SRCTGT,
2465         MDD_RN_TGTSRC
2466 };
2467
2468 static int mdd_rename_order(const struct lu_env *env,
2469                             struct mdd_device *mdd,
2470                             struct mdd_object *src_pobj,
2471                             const struct lu_attr *pattr,
2472                             struct mdd_object *tgt_pobj)
2473 {
2474         /* order of locking, 1 - tgt-src, 0 - src-tgt*/
2475         int rc;
2476         ENTRY;
2477
2478         if (src_pobj == tgt_pobj)
2479                 RETURN(MDD_RN_SAME);
2480
2481         /* compared the parent child relationship of src_p&tgt_p */
2482         if (lu_fid_eq(&mdd->mdd_root_fid, mdo2fid(src_pobj))){
2483                 rc = MDD_RN_SRCTGT;
2484         } else if (lu_fid_eq(&mdd->mdd_root_fid, mdo2fid(tgt_pobj))) {
2485                 rc = MDD_RN_TGTSRC;
2486         } else {
2487                 rc = mdd_is_parent(env, mdd, src_pobj, pattr, mdo2fid(tgt_pobj),
2488                                    NULL);
2489                 if (rc == -EREMOTE)
2490                         rc = 0;
2491
2492                 if (rc == 1)
2493                         rc = MDD_RN_TGTSRC;
2494                 else if (rc == 0)
2495                         rc = MDD_RN_SRCTGT;
2496         }
2497
2498         RETURN(rc);
2499 }
2500
2501 /* has not mdd_write{read}_lock on any obj yet. */
2502 static int mdd_rename_sanity_check(const struct lu_env *env,
2503                                    struct mdd_object *src_pobj,
2504                                    const struct lu_attr *pattr,
2505                                    struct mdd_object *tgt_pobj,
2506                                    const struct lu_attr *tpattr,
2507                                    struct mdd_object *sobj,
2508                                    const struct lu_attr *cattr,
2509                                    struct mdd_object *tobj,
2510                                    const struct lu_attr *tattr)
2511 {
2512         int rc = 0;
2513         ENTRY;
2514
2515         /* XXX: when get here, sobj must NOT be NULL,
2516          * the other case has been processed in cld_rename
2517          * before mdd_rename and enable MDS_PERM_BYPASS. */
2518         LASSERT(sobj);
2519
2520         rc = mdd_may_delete(env, src_pobj, pattr, sobj, cattr, NULL, 1, 0);
2521         if (rc)
2522                 RETURN(rc);
2523
2524         /* XXX: when get here, "tobj == NULL" means tobj must
2525          * NOT exist (neither on remote MDS, such case has been
2526          * processed in cld_rename before mdd_rename and enable
2527          * MDS_PERM_BYPASS).
2528          * So check may_create, but not check may_unlink. */
2529         if (tobj == NULL)
2530                 rc = mdd_may_create(env, tgt_pobj, tpattr, NULL,
2531                                     (src_pobj != tgt_pobj));
2532         else
2533                 rc = mdd_may_delete(env, tgt_pobj, tpattr, tobj, tattr, cattr,
2534                                     (src_pobj != tgt_pobj), 1);
2535
2536         if (!rc && !tobj && (src_pobj != tgt_pobj) && S_ISDIR(cattr->la_mode))
2537                 rc = __mdd_may_link(env, tgt_pobj, tpattr);
2538
2539         RETURN(rc);
2540 }
2541
2542 static int mdd_declare_rename(const struct lu_env *env,
2543                               struct mdd_device *mdd,
2544                               struct mdd_object *mdd_spobj,
2545                               struct mdd_object *mdd_tpobj,
2546                               struct mdd_object *mdd_sobj,
2547                               struct mdd_object *mdd_tobj,
2548                               const struct lu_name *tname,
2549                               const struct lu_name *sname,
2550                               struct md_attr *ma,
2551                               struct linkea_data *ldata,
2552                               struct thandle *handle)
2553 {
2554         struct lu_attr    *la = &mdd_env_info(env)->mti_la_for_fix;
2555         int rc;
2556
2557         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
2558         la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
2559
2560         LASSERT(mdd_spobj);
2561         LASSERT(mdd_tpobj);
2562         LASSERT(mdd_sobj);
2563
2564         /* name from source dir */
2565         rc = mdo_declare_index_delete(env, mdd_spobj, sname->ln_name, handle);
2566         if (rc)
2567                 return rc;
2568
2569         /* .. from source child */
2570         if (S_ISDIR(mdd_object_type(mdd_sobj))) {
2571                 /* source child can be directory,
2572                  * counted by source dir's nlink */
2573                 rc = mdo_declare_ref_del(env, mdd_spobj, handle);
2574                 if (rc)
2575                         return rc;
2576                 if (mdd_spobj != mdd_tpobj) {
2577                         rc = mdo_declare_index_delete(env, mdd_sobj, dotdot,
2578                                                       handle);
2579                         if (rc != 0)
2580                                 return rc;
2581
2582                         rc = mdo_declare_index_insert(env, mdd_sobj,
2583                                                       mdo2fid(mdd_tpobj),
2584                                                       S_IFDIR, dotdot, handle);
2585                         if (rc != 0)
2586                                 return rc;
2587                 }
2588
2589                 /* new target child can be directory,
2590                  * counted by target dir's nlink */
2591                 rc = mdo_declare_ref_add(env, mdd_tpobj, handle);
2592                 if (rc != 0)
2593                         return rc;
2594         }
2595
2596         la->la_valid = LA_CTIME | LA_MTIME;
2597         rc = mdo_declare_attr_set(env, mdd_spobj, la, handle);
2598         if (rc != 0)
2599                 return rc;
2600
2601         rc = mdo_declare_attr_set(env, mdd_tpobj, la, handle);
2602         if (rc != 0)
2603                 return rc;
2604
2605         la->la_valid = LA_CTIME;
2606         rc = mdo_declare_attr_set(env, mdd_sobj, la, handle);
2607         if (rc)
2608                 return rc;
2609
2610         rc = mdd_declare_links_add(env, mdd_sobj, handle, ldata);
2611         if (rc)
2612                 return rc;
2613
2614         /* new name */
2615         rc = mdo_declare_index_insert(env, mdd_tpobj, mdo2fid(mdd_sobj),
2616                                       mdd_object_type(mdd_sobj),
2617                                       tname->ln_name, handle);
2618         if (rc != 0)
2619                 return rc;
2620
2621         /* name from target dir (old name), we declare it unconditionally
2622          * as mdd_rename() calls delete unconditionally as well. so just
2623          * to balance declarations vs calls to change ... */
2624         rc = mdo_declare_index_delete(env, mdd_tpobj, tname->ln_name, handle);
2625         if (rc)
2626                 return rc;
2627
2628         if (mdd_tobj && mdd_object_exists(mdd_tobj)) {
2629                 /* delete target child in target parent directory */
2630                 rc = mdo_declare_ref_del(env, mdd_tobj, handle);
2631                 if (rc)
2632                         return rc;
2633
2634                 if (S_ISDIR(mdd_object_type(mdd_tobj))) {
2635                         /* target child can be directory,
2636                          * delete "." reference in target child directory */
2637                         rc = mdo_declare_ref_del(env, mdd_tobj, handle);
2638                         if (rc)
2639                                 return rc;
2640
2641                         /* delete ".." reference in target parent directory */
2642                         rc = mdo_declare_ref_del(env, mdd_tpobj, handle);
2643                         if (rc)
2644                                 return rc;
2645                 }
2646
2647                 la->la_valid = LA_CTIME;
2648                 rc = mdo_declare_attr_set(env, mdd_tobj, la, handle);
2649                 if (rc)
2650                         return rc;
2651
2652                 rc = mdd_declare_finish_unlink(env, mdd_tobj, handle);
2653                 if (rc)
2654                         return rc;
2655         }
2656
2657         rc = mdd_declare_changelog_ext_store(env, mdd, tname, sname, handle);
2658         if (rc)
2659                 return rc;
2660
2661         return rc;
2662 }
2663
2664 /* src object can be remote that is why we use only fid and type of object */
2665 static int mdd_rename(const struct lu_env *env,
2666                       struct md_object *src_pobj, struct md_object *tgt_pobj,
2667                       const struct lu_fid *lf, const struct lu_name *lsname,
2668                       struct md_object *tobj, const struct lu_name *ltname,
2669                       struct md_attr *ma)
2670 {
2671         const char *sname = lsname->ln_name;
2672         const char *tname = ltname->ln_name;
2673         struct lu_attr    *la = &mdd_env_info(env)->mti_la_for_fix;
2674         struct mdd_object *mdd_spobj = md2mdd_obj(src_pobj); /* source parent */
2675         struct mdd_object *mdd_tpobj = md2mdd_obj(tgt_pobj);
2676         struct mdd_device *mdd = mdo2mdd(src_pobj);
2677         struct mdd_object *mdd_sobj = NULL;                  /* source object */
2678         struct mdd_object *mdd_tobj = NULL;
2679         struct lu_attr *cattr = MDD_ENV_VAR(env, cattr);
2680         struct lu_attr *pattr = MDD_ENV_VAR(env, pattr);
2681         struct lu_attr *tattr = MDD_ENV_VAR(env, tattr);
2682         struct lu_attr *tpattr = MDD_ENV_VAR(env, tpattr);
2683         struct thandle *handle;
2684         struct linkea_data  *ldata = &mdd_env_info(env)->mti_link_data;
2685         const struct lu_fid *tpobj_fid = mdo2fid(mdd_tpobj);
2686         const struct lu_fid *spobj_fid = mdo2fid(mdd_spobj);
2687         bool is_dir;
2688         bool tobj_ref = 0;
2689         bool tobj_locked = 0;
2690         unsigned cl_flags = 0;
2691         int rc, rc2;
2692         ENTRY;
2693
2694         if (tobj)
2695                 mdd_tobj = md2mdd_obj(tobj);
2696
2697         mdd_sobj = mdd_object_find(env, mdd, lf);
2698
2699         rc = mdd_la_get(env, mdd_sobj, cattr, BYPASS_CAPA);
2700         if (rc)
2701                 GOTO(out_pending, rc);
2702
2703         rc = mdd_la_get(env, mdd_spobj, pattr, BYPASS_CAPA);
2704         if (rc)
2705                 GOTO(out_pending, rc);
2706
2707         if (mdd_tobj) {
2708                 rc = mdd_la_get(env, mdd_tobj, tattr, BYPASS_CAPA);
2709                 if (rc)
2710                         GOTO(out_pending, rc);
2711         }
2712
2713         rc = mdd_la_get(env, mdd_tpobj, tpattr, BYPASS_CAPA);
2714         if (rc)
2715                 GOTO(out_pending, rc);
2716
2717         rc = mdd_rename_sanity_check(env, mdd_spobj, pattr, mdd_tpobj, tpattr,
2718                                      mdd_sobj, cattr, mdd_tobj, tattr);
2719         if (rc)
2720                 GOTO(out_pending, rc);
2721
2722         rc = mdd_name_check(mdd, ltname);
2723         if (rc < 0)
2724                 GOTO(out_pending, rc);
2725
2726         handle = mdd_trans_create(env, mdd);
2727         if (IS_ERR(handle))
2728                 GOTO(out_pending, rc = PTR_ERR(handle));
2729
2730         memset(ldata, 0, sizeof(*ldata));
2731         mdd_linkea_prepare(env, mdd_sobj, NULL, NULL, mdd_object_fid(mdd_tpobj),
2732                            ltname, 1, 0, ldata);
2733         rc = mdd_declare_rename(env, mdd, mdd_spobj, mdd_tpobj, mdd_sobj,
2734                                 mdd_tobj, lsname, ltname, ma, ldata, handle);
2735         if (rc)
2736                 GOTO(stop, rc);
2737
2738         rc = mdd_trans_start(env, mdd, handle);
2739         if (rc)
2740                 GOTO(stop, rc);
2741
2742         /* FIXME: Should consider tobj and sobj too in rename_lock. */
2743         rc = mdd_rename_order(env, mdd, mdd_spobj, pattr, mdd_tpobj);
2744         if (rc < 0)
2745                 GOTO(cleanup_unlocked, rc);
2746
2747         is_dir = S_ISDIR(cattr->la_mode);
2748
2749         /* Remove source name from source directory */
2750         rc = __mdd_index_delete(env, mdd_spobj, sname, is_dir, handle,
2751                                 mdd_object_capa(env, mdd_spobj));
2752         if (rc)
2753                 GOTO(cleanup, rc);
2754
2755         /* "mv dir1 dir2" needs "dir1/.." link update */
2756         if (is_dir && mdd_sobj && !lu_fid_eq(spobj_fid, tpobj_fid)) {
2757                 rc = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle,
2758                                         mdd_object_capa(env, mdd_sobj));
2759                 if (rc != 0)
2760                         GOTO(fixup_spobj2, rc);
2761
2762                 rc = __mdd_index_insert_only(env, mdd_sobj, tpobj_fid, S_IFDIR,
2763                                              dotdot, handle,
2764                                              mdd_object_capa(env, mdd_sobj));
2765                 if (rc != 0)
2766                         GOTO(fixup_spobj, rc);
2767         }
2768
2769         /* Remove target name from target directory
2770          * Here tobj can be remote one, so we do index_delete unconditionally
2771          * and -ENOENT is allowed.
2772          */
2773         rc = __mdd_index_delete(env, mdd_tpobj, tname, is_dir, handle,
2774                                 mdd_object_capa(env, mdd_tpobj));
2775         if (rc != 0) {
2776                 if (mdd_tobj) {
2777                         /* tname might been renamed to something else */
2778                         GOTO(fixup_spobj, rc);
2779                 }
2780                 if (rc != -ENOENT)
2781                         GOTO(fixup_spobj, rc);
2782         }
2783
2784         /* Insert new fid with target name into target dir */
2785         rc = __mdd_index_insert(env, mdd_tpobj, lf, cattr->la_mode,
2786                                 tname, handle, mdd_object_capa(env, mdd_tpobj));
2787         if (rc != 0)
2788                 GOTO(fixup_tpobj, rc);
2789
2790         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
2791         la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
2792
2793         /* XXX: mdd_sobj must be local one if it is NOT NULL. */
2794         if (mdd_sobj) {
2795                 la->la_valid = LA_CTIME;
2796                 rc = mdd_update_time(env, mdd_sobj, cattr, la, handle);
2797                 if (rc)
2798                         GOTO(fixup_tpobj, rc);
2799         }
2800
2801         /* Remove old target object
2802          * For tobj is remote case cmm layer has processed
2803          * and set tobj to NULL then. So when tobj is NOT NULL,
2804          * it must be local one.
2805          */
2806         if (tobj && mdd_object_exists(mdd_tobj)) {
2807                 mdd_write_lock(env, mdd_tobj, MOR_TGT_CHILD);
2808                 tobj_locked = 1;
2809                 if (mdd_is_dead_obj(mdd_tobj)) {
2810                         /* shld not be dead, something is wrong */
2811                         CERROR("tobj is dead, something is wrong\n");
2812                         rc = -EINVAL;
2813                         goto cleanup;
2814                 }
2815                 mdo_ref_del(env, mdd_tobj, handle);
2816
2817                 /* Remove dot reference. */
2818                 if (S_ISDIR(tattr->la_mode))
2819                         mdo_ref_del(env, mdd_tobj, handle);
2820                 tobj_ref = 1;
2821
2822                 /* fetch updated nlink */
2823                 rc = mdd_la_get(env, mdd_tobj, tattr, BYPASS_CAPA);
2824                 if (rc != 0) {
2825                         CERROR("%s: Failed to get nlink for tobj "
2826                                 DFID": rc = %d\n",
2827                                 mdd2obd_dev(mdd)->obd_name,
2828                                 PFID(tpobj_fid), rc);
2829                         GOTO(fixup_tpobj, rc);
2830                 }
2831
2832                 la->la_valid = LA_CTIME;
2833                 rc = mdd_update_time(env, mdd_tobj, tattr, la, handle);
2834                 if (rc != 0) {
2835                         CERROR("%s: Failed to set ctime for tobj "
2836                                 DFID": rc = %d\n",
2837                                 mdd2obd_dev(mdd)->obd_name,
2838                                 PFID(tpobj_fid), rc);
2839                         GOTO(fixup_tpobj, rc);
2840                 }
2841
2842                 /* XXX: this transfer to ma will be removed with LOD/OSP */
2843                 ma->ma_attr = *tattr;
2844                 ma->ma_valid |= MA_INODE;
2845                 rc = mdd_finish_unlink(env, mdd_tobj, ma, mdd_tpobj, ltname,
2846                                        handle);
2847                 if (rc != 0) {
2848                         CERROR("%s: Failed to unlink tobj "
2849                                 DFID": rc = %d\n",
2850                                 mdd2obd_dev(mdd)->obd_name,
2851                                 PFID(tpobj_fid), rc);
2852                         GOTO(fixup_tpobj, rc);
2853                 }
2854
2855                 /* fetch updated nlink */
2856                 rc = mdd_la_get(env, mdd_tobj, tattr, BYPASS_CAPA);
2857                 if (rc != 0) {
2858                         CERROR("%s: Failed to get nlink for tobj "
2859                                 DFID": rc = %d\n",
2860                                 mdd2obd_dev(mdd)->obd_name,
2861                                 PFID(tpobj_fid), rc);
2862                         GOTO(fixup_tpobj, rc);
2863                 }
2864                 /* XXX: this transfer to ma will be removed with LOD/OSP */
2865                 ma->ma_attr = *tattr;
2866                 ma->ma_valid |= MA_INODE;
2867
2868                 if (tattr->la_nlink == 0) {
2869                         cl_flags |= CLF_RENAME_LAST;
2870                         if (mdd_hsm_archive_exists(env, mdd_tobj, ma))
2871                                 cl_flags |= CLF_RENAME_LAST_EXISTS;
2872                 }
2873         }
2874
2875         la->la_valid = LA_CTIME | LA_MTIME;
2876         rc = mdd_update_time(env, mdd_spobj, pattr, la, handle);
2877         if (rc)
2878                 GOTO(fixup_tpobj, rc);
2879
2880         if (mdd_spobj != mdd_tpobj) {
2881                 la->la_valid = LA_CTIME | LA_MTIME;
2882                 rc = mdd_update_time(env, mdd_tpobj, tpattr, la, handle);
2883         }
2884
2885         if (rc == 0 && mdd_sobj) {
2886                 mdd_write_lock(env, mdd_sobj, MOR_SRC_CHILD);
2887                 rc = mdd_links_rename(env, mdd_sobj, mdo2fid(mdd_spobj), lsname,
2888                                       mdo2fid(mdd_tpobj), ltname, handle, NULL,
2889                                       0, 0);
2890                 if (rc == -ENOENT)
2891                         /* Old files might not have EA entry */
2892                         mdd_links_add(env, mdd_sobj, mdo2fid(mdd_spobj),
2893                                       lsname, handle, NULL, 0);
2894                 mdd_write_unlock(env, mdd_sobj);
2895                 /* We don't fail the transaction if the link ea can't be
2896                    updated -- fid2path will use alternate lookup method. */
2897                 rc = 0;
2898         }
2899
2900         EXIT;
2901
2902 fixup_tpobj:
2903         if (rc) {
2904                 rc2 = __mdd_index_delete(env, mdd_tpobj, tname, is_dir, handle,
2905                                          BYPASS_CAPA);
2906                 if (rc2)
2907                         CWARN("tp obj fix error %d\n",rc2);
2908
2909                 if (mdd_tobj && mdd_object_exists(mdd_tobj) &&
2910                     !mdd_is_dead_obj(mdd_tobj)) {
2911                         if (tobj_ref) {
2912                                 mdo_ref_add(env, mdd_tobj, handle);
2913                                 if (is_dir)
2914                                         mdo_ref_add(env, mdd_tobj, handle);
2915                         }
2916
2917                         rc2 = __mdd_index_insert(env, mdd_tpobj,
2918                                                   mdo2fid(mdd_tobj),
2919                                                   mdd_object_type(mdd_tobj),
2920                                                   tname, handle, BYPASS_CAPA);
2921                         if (rc2 != 0)
2922                                 CWARN("tp obj fix error: rc = %d\n", rc2);
2923                 }
2924         }
2925
2926 fixup_spobj:
2927         if (rc && is_dir && mdd_sobj && mdd_spobj != mdd_tpobj) {
2928                 rc2 = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle,
2929                                               BYPASS_CAPA);
2930
2931                 if (rc2)
2932                         CWARN("%s: sp obj dotdot delete error: rc = %d\n",
2933                                mdd2obd_dev(mdd)->obd_name, rc2);
2934
2935
2936                 rc2 = __mdd_index_insert_only(env, mdd_sobj, spobj_fid, S_IFDIR,
2937                                               dotdot, handle, BYPASS_CAPA);
2938                 if (rc2 != 0)
2939                         CWARN("%s: sp obj dotdot insert error: rc = %d\n",
2940                               mdd2obd_dev(mdd)->obd_name, rc2);
2941         }
2942
2943 fixup_spobj2:
2944         if (rc != 0) {
2945                 rc2 = __mdd_index_insert(env, mdd_spobj, lf,
2946                                          mdd_object_type(mdd_sobj), sname,
2947                                          handle, BYPASS_CAPA);
2948                 if (rc2 != 0)
2949                         CWARN("sp obj fix error: rc = %d\n", rc2);
2950         }
2951
2952 cleanup:
2953         if (tobj_locked)
2954                 mdd_write_unlock(env, mdd_tobj);
2955
2956 cleanup_unlocked:
2957         if (rc == 0)
2958                 rc = mdd_changelog_ext_ns_store(env, mdd, CL_RENAME, cl_flags,
2959                                                 mdd_tobj, tpobj_fid, lf,
2960                                                 spobj_fid, ltname, lsname,
2961                                                 handle);
2962
2963 stop:
2964         mdd_trans_stop(env, mdd, rc, handle);
2965
2966 out_pending:
2967         mdd_object_put(env, mdd_sobj);
2968         return rc;
2969 }
2970
2971 /**
2972  * During migration once the parent FID has been changed,
2973  * we need update the parent FID in linkea.
2974  **/
2975 static int mdd_linkea_update_child_internal(const struct lu_env *env,
2976                                             struct mdd_object *parent,
2977                                             struct mdd_object *child,
2978                                             const char *name, int namelen,
2979                                             struct thandle *handle,
2980                                             bool declare)
2981 {
2982         struct mdd_thread_info  *info = mdd_env_info(env);
2983         struct linkea_data      ldata = {0};
2984         struct lu_buf           *buf = &info->mti_link_buf;
2985         int                     count;
2986         int                     rc = 0;
2987
2988         ENTRY;
2989
2990         buf = lu_buf_check_and_alloc(buf, PATH_MAX);
2991         if (buf->lb_buf == NULL)
2992                 RETURN(-ENOMEM);
2993
2994         ldata.ld_buf = buf;
2995         rc = mdd_links_read(env, child, &ldata);
2996         if (rc != 0) {
2997                 if (rc == -ENOENT || rc == -ENODATA)
2998                         rc = 0;
2999                 RETURN(rc);
3000         }
3001
3002         LASSERT(ldata.ld_leh != NULL);
3003         ldata.ld_lee = (struct link_ea_entry *)(ldata.ld_leh + 1);
3004         for (count = 0; count < ldata.ld_leh->leh_reccount; count++) {
3005                 struct mdd_device *mdd = mdo2mdd(&child->mod_obj);
3006                 struct lu_name lname;
3007                 struct lu_fid  fid;
3008
3009                 linkea_entry_unpack(ldata.ld_lee, &ldata.ld_reclen,
3010                                     &lname, &fid);
3011
3012                 if (strncmp(lname.ln_name, name, namelen) != 0 ||
3013                     lu_fid_eq(&fid, mdd_object_fid(parent))) {
3014                         ldata.ld_lee = (struct link_ea_entry *)
3015                                        ((char *)ldata.ld_lee +
3016                                         ldata.ld_reclen);
3017                         continue;
3018                 }
3019
3020                 CDEBUG(D_INFO, "%s: update "DFID" with %.*s:"DFID"\n",
3021                        mdd2obd_dev(mdd)->obd_name, PFID(mdd_object_fid(child)),
3022                        lname.ln_namelen, lname.ln_name,
3023                        PFID(mdd_object_fid(parent)));
3024                 /* update to the new parent fid */
3025                 linkea_entry_pack(ldata.ld_lee, &lname,
3026                                   mdd_object_fid(parent));
3027                 if (declare)
3028                         rc = mdd_declare_links_add(env, child, handle, &ldata);
3029                 else
3030                         rc = mdd_links_write(env, child, &ldata, handle);
3031                 break;
3032         }
3033         RETURN(rc);
3034 }
3035
3036 static int mdd_linkea_declare_update_child(const struct lu_env *env,
3037                                            struct mdd_object *parent,
3038                                            struct mdd_object *child,
3039                                            const char *name, int namelen,
3040                                            struct thandle *handle)
3041 {
3042         return mdd_linkea_update_child_internal(env, parent, child, name,
3043                                                 namelen, handle, true);
3044 }
3045
3046 static int mdd_linkea_update_child(const struct lu_env *env,
3047                                    struct mdd_object *parent,
3048                                    struct mdd_object *child,
3049                                    const char *name, int namelen,
3050                                    struct thandle *handle)
3051 {
3052         return mdd_linkea_update_child_internal(env, parent, child, name,
3053                                                 namelen, handle, false);
3054 }
3055
3056 static int mdd_update_linkea_internal(const struct lu_env *env,
3057                                       struct mdd_object *mdd_pobj,
3058                                       struct mdd_object *mdd_sobj,
3059                                       struct mdd_object *mdd_tobj,
3060                                       const struct lu_name *child_name,
3061                                       struct thandle *handle,
3062                                       int declare)
3063 {
3064         struct mdd_thread_info  *info = mdd_env_info(env);
3065         struct linkea_data      *ldata = &info->mti_link_data;
3066         int                     count;
3067         int                     rc = 0;
3068         ENTRY;
3069
3070         rc = mdd_links_read(env, mdd_sobj, ldata);
3071         if (rc != 0) {
3072                 if (rc == -ENOENT || rc == -ENODATA)
3073                         rc = 0;
3074                 RETURN(rc);
3075         }
3076
3077         if (declare)
3078                 rc = mdd_declare_links_add(env, mdd_tobj, handle, ldata);
3079         else
3080                 rc = mdd_links_write(env, mdd_tobj, ldata, handle);
3081
3082         if (rc != 0)
3083                 RETURN(rc);
3084
3085         /* If it is mulitple links file, we need update the name entry for
3086          * all parent */
3087         LASSERT(ldata->ld_leh != NULL);
3088         ldata->ld_lee = (struct link_ea_entry *)(ldata->ld_leh + 1);
3089         for (count = 0; count < ldata->ld_leh->leh_reccount; count++) {
3090                 struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3091                 struct mdd_object       *pobj;
3092                 struct lu_name          lname;
3093                 struct lu_fid           fid;
3094
3095                 linkea_entry_unpack(ldata->ld_lee, &ldata->ld_reclen,
3096                                     &lname, &fid);
3097                 ldata->ld_lee = (struct link_ea_entry *)((char *)ldata->ld_lee +
3098                                                          ldata->ld_reclen);
3099                 pobj = mdd_object_find(env, mdd, &fid);
3100                 if (IS_ERR(pobj)) {
3101                         CWARN("%s: cannot find obj "DFID": rc = %ld\n",
3102                               mdd2obd_dev(mdd)->obd_name, PFID(&fid),
3103                               PTR_ERR(pobj));
3104                         continue;
3105                 }
3106
3107                 if (!mdd_object_exists(pobj)) {
3108                         CDEBUG(D_INFO, "%s: obj "DFID" does not exist\n",
3109                               mdd2obd_dev(mdd)->obd_name, PFID(&fid));
3110                         GOTO(next_put, rc);
3111                 }
3112
3113                 if (pobj == mdd_pobj &&
3114                     lname.ln_namelen == child_name->ln_namelen &&
3115                     strncmp(lname.ln_name, child_name->ln_name,
3116                             lname.ln_namelen) == 0) {
3117                         CDEBUG(D_INFO, "%s: skip its own %s: "DFID"\n",
3118                               mdd2obd_dev(mdd)->obd_name, child_name->ln_name,
3119                               PFID(&fid));
3120                         GOTO(next_put, rc);
3121                 }
3122
3123                 CDEBUG(D_INFO, "%s: update "DFID" with "DNAME":"DFID"\n",
3124                        mdd2obd_dev(mdd)->obd_name, PFID(mdd_object_fid(pobj)),
3125                        PNAME(&lname), PFID(mdd_object_fid(mdd_tobj)));
3126
3127                 if (declare) {
3128                         /* Remove source name from source directory */
3129                         /* Insert new fid with target name into target dir */
3130                         rc = mdo_declare_index_delete(env, pobj, lname.ln_name,
3131                                                       handle);
3132                         if (rc != 0)
3133                                 GOTO(next_put, rc);
3134
3135                         rc = mdo_declare_index_insert(env, pobj,
3136                                         mdd_object_fid(mdd_tobj),
3137                                         mdd_object_type(mdd_tobj),
3138                                         lname.ln_name, handle);
3139                         if (rc != 0)
3140                                 GOTO(next_put, rc);
3141
3142                         rc = mdo_declare_ref_add(env, mdd_tobj, handle);
3143                         if (rc)
3144                                 GOTO(next_put, rc);
3145
3146                         rc = mdo_declare_ref_del(env, mdd_sobj, handle);
3147                         if (rc)
3148                                 GOTO(next_put, rc);
3149                 } else {
3150                         rc = __mdd_index_delete(env, pobj, lname.ln_name,
3151                                                 0, handle,
3152                                                 mdd_object_capa(env, pobj));
3153                         if (rc)
3154                                 GOTO(next_put, rc);
3155
3156                         rc = __mdd_index_insert(env, pobj,
3157                                         mdd_object_fid(mdd_tobj),
3158                                         mdd_object_type(mdd_tobj),
3159                                         lname.ln_name, handle,
3160                                         mdd_object_capa(env, pobj));
3161                         if (rc != 0)
3162                                 GOTO(next_put, rc);
3163
3164                         mdd_write_lock(env, mdd_tobj, MOR_SRC_CHILD);
3165                         rc = mdo_ref_add(env, mdd_tobj, handle);
3166                         mdd_write_unlock(env, mdd_tobj);
3167                         if (rc)
3168                                 GOTO(next_put, rc);
3169
3170                         mdd_write_lock(env, mdd_sobj, MOR_TGT_CHILD);
3171                         mdo_ref_del(env, mdd_sobj, handle);
3172                         mdd_write_unlock(env, mdd_sobj);
3173                 }
3174 next_put:
3175                 mdd_object_put(env, pobj);
3176                 if (rc != 0)
3177                         break;
3178         }
3179
3180         RETURN(rc);
3181 }
3182
3183 static int mdd_migrate_xattrs(const struct lu_env *env,
3184                               struct mdd_object *mdd_sobj,
3185                               struct mdd_object *mdd_tobj)
3186 {
3187         struct mdd_thread_info  *info = mdd_env_info(env);
3188         struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3189         char                    *xname;
3190         struct thandle          *handle;
3191         struct lu_buf           xbuf;
3192         int                     xlen;
3193         int                     rem;
3194         int                     xsize;
3195         int                     list_xsize;
3196         struct lu_buf           list_xbuf;
3197         int                     rc;
3198
3199         /* retrieve xattr list from the old object */
3200         list_xsize = mdo_xattr_list(env, mdd_sobj, &LU_BUF_NULL,
3201                                     mdd_object_capa(env, mdd_sobj));
3202         if (list_xsize == -ENODATA)
3203                 return 0;
3204
3205         if (list_xsize < 0)
3206                 return list_xsize;
3207
3208         lu_buf_check_and_alloc(&info->mti_big_buf, list_xsize);
3209         if (info->mti_big_buf.lb_buf == NULL)
3210                 return -ENOMEM;
3211
3212         list_xbuf.lb_buf = info->mti_big_buf.lb_buf;
3213         list_xbuf.lb_len = list_xsize;
3214         rc = mdo_xattr_list(env, mdd_sobj, &list_xbuf,
3215                             mdd_object_capa(env, mdd_sobj));
3216         if (rc < 0)
3217                 return rc;
3218         rc = 0;
3219         rem = list_xsize;
3220         xname = list_xbuf.lb_buf;
3221         while (rem > 0) {
3222                 xlen = strnlen(xname, rem - 1) + 1;
3223                 if (strcmp(XATTR_NAME_LINK, xname) == 0 ||
3224                     strcmp(XATTR_NAME_LMA, xname) == 0 ||
3225                     strcmp(XATTR_NAME_LMV, xname) == 0)
3226                         goto next;
3227
3228                 /* For directory, if there are default layout, migrate here */
3229                 if (strcmp(XATTR_NAME_LOV, xname) == 0 &&
3230                     !S_ISDIR(lu_object_attr(&mdd_sobj->mod_obj.mo_lu)))
3231                         goto next;
3232
3233                 xsize = mdo_xattr_get(env, mdd_sobj, &LU_BUF_NULL,
3234                                       xname,
3235                                       mdd_object_capa(env, mdd_sobj));
3236                 if (xsize == -ENODATA)
3237                         goto next;
3238                 if (xsize < 0)
3239                         GOTO(out, rc);
3240
3241                 lu_buf_check_and_alloc(&info->mti_link_buf, xsize);
3242                 if (info->mti_link_buf.lb_buf == NULL)
3243                         GOTO(out, rc = -ENOMEM);
3244
3245                 xbuf.lb_len = xsize;
3246                 xbuf.lb_buf = info->mti_link_buf.lb_buf;
3247                 rc = mdo_xattr_get(env, mdd_sobj, &xbuf, xname,
3248                                    mdd_object_capa(env, mdd_sobj));
3249                 if (rc == -ENODATA)
3250                         goto next;
3251                 if (rc < 0)
3252                         GOTO(out, rc);
3253
3254                 handle = mdd_trans_create(env, mdd);
3255                 if (IS_ERR(handle))
3256                         GOTO(out, rc = PTR_ERR(handle));
3257
3258                 rc = mdo_declare_xattr_set(env, mdd_tobj, &xbuf, xname, 0,
3259                                            handle);
3260                 if (rc != 0)
3261                         GOTO(stop_trans, rc);
3262                 /* Note: this transaction is part of migration, and it is not
3263                  * the last step of migration, so we set th_local = 1 to avoid
3264                  * update last rcvd for this transaction */
3265                 handle->th_local = 1;
3266                 rc = mdd_trans_start(env, mdd, handle);
3267                 if (rc != 0)
3268                         GOTO(stop_trans, rc);
3269
3270                 rc = mdo_xattr_set(env, mdd_tobj, &xbuf, xname, 0, handle,
3271                                    mdd_object_capa(env, mdd_sobj));
3272                 if (rc == -EEXIST)
3273                         GOTO(stop_trans, rc = 0);
3274
3275                 if (rc != 0)
3276                         GOTO(stop_trans, rc);
3277 stop_trans:
3278                 mdd_trans_stop(env, mdd, rc, handle);
3279                 if (rc != 0)
3280                         GOTO(out, rc);
3281 next:
3282                 rem -= xlen;
3283                 memmove(xname, xname + xlen, rem);
3284         }
3285 out:
3286         return rc;
3287 }
3288
3289 static int mdd_declare_migrate_create(const struct lu_env *env,
3290                                       struct mdd_object *mdd_pobj,
3291                                       struct mdd_object *mdd_sobj,
3292                                       struct mdd_object *mdd_tobj,
3293                                       struct md_op_spec *spec,
3294                                       struct lu_attr *la,
3295                                       union lmv_mds_md *mgr_ea,
3296                                       struct thandle *handle)
3297 {
3298         struct lu_attr          *la_flag = MDD_ENV_VAR(env, la_for_fix);
3299         const struct lu_buf     *buf;
3300         int                     rc;
3301         int                     mgr_easize;
3302
3303         rc = mdd_declare_object_create_internal(env, mdd_pobj, mdd_tobj, la,
3304                                                 handle, spec, NULL);
3305         if (rc != 0)
3306                 return rc;
3307
3308         rc = mdd_declare_object_initialize(env, mdd_pobj, mdd_tobj, la,
3309                                            handle);
3310         if (rc != 0)
3311                 return rc;
3312
3313         if (S_ISLNK(la->la_mode)) {
3314                 const char *target_name = spec->u.sp_symname;
3315                 int sym_len = strlen(target_name);
3316                 const struct lu_buf *buf;
3317
3318                 buf = mdd_buf_get_const(env, target_name, sym_len);
3319                 rc = dt_declare_record_write(env, mdd_object_child(mdd_tobj),
3320                                              buf, 0, handle);
3321                 if (rc != 0)
3322                         return rc;
3323         }
3324
3325         if (spec->u.sp_ea.eadata != NULL && spec->u.sp_ea.eadatalen != 0) {
3326                 buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
3327                                         spec->u.sp_ea.eadatalen);
3328                 rc = mdo_declare_xattr_set(env, mdd_tobj, buf, XATTR_NAME_LOV,
3329                                            0, handle);
3330                 if (rc)
3331                         return rc;
3332         }
3333
3334         mgr_easize = lmv_mds_md_size(2, LMV_MAGIC_V1);
3335         buf = mdd_buf_get_const(env, mgr_ea, mgr_easize);
3336         rc = mdo_declare_xattr_set(env, mdd_sobj, buf, XATTR_NAME_LMV,
3337                                    0, handle);
3338         if (rc)
3339                 return rc;
3340
3341         la_flag->la_valid = LA_FLAGS;
3342         la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL;
3343         mdd_flags_xlate(mdd_sobj, la_flag->la_flags);
3344         rc = mdo_declare_attr_set(env, mdd_sobj, la_flag, handle);
3345
3346         return rc;
3347 }
3348
3349 static int mdd_migrate_create(const struct lu_env *env,
3350                               struct mdd_object *mdd_pobj,
3351                               struct mdd_object *mdd_sobj,
3352                               struct mdd_object *mdd_tobj,
3353                               struct lu_attr *la)
3354 {
3355         struct mdd_thread_info  *info = mdd_env_info(env);
3356         struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3357         struct md_op_spec       *spec = &info->mti_spec;
3358         struct lu_buf           lmm_buf = { 0 };
3359         struct lu_buf           link_buf = { 0 };
3360         const struct lu_buf     *buf;
3361         struct thandle          *handle;
3362         struct lmv_mds_md_v1    *mgr_ea;
3363         struct lu_attr          *la_flag = MDD_ENV_VAR(env, la_for_fix);
3364         struct dt_allocation_hint *hint = &mdd_env_info(env)->mti_hint;
3365         int                     mgr_easize;
3366         int                     rc;
3367         ENTRY;
3368
3369         /* prepare spec for create */
3370         memset(spec, 0, sizeof(*spec));
3371         spec->sp_cr_lookup = 0;
3372         spec->sp_feat = &dt_directory_features;
3373         if (S_ISLNK(la->la_mode)) {
3374                 buf = lu_buf_check_and_alloc(
3375                                 &mdd_env_info(env)->mti_big_buf,
3376                                 la->la_size + 1);
3377                 link_buf = *buf;
3378                 link_buf.lb_len = la->la_size + 1;
3379                 rc = mdd_readlink(env, &mdd_sobj->mod_obj, &link_buf);
3380                 if (rc <= 0) {
3381                         rc = rc != 0 ? rc : -EFAULT;
3382                         CERROR("%s: "DFID" readlink failed: rc = %d\n",
3383                                mdd2obd_dev(mdd)->obd_name,
3384                                PFID(mdd_object_fid(mdd_sobj)), rc);
3385                         RETURN(rc);
3386                 }
3387                 spec->u.sp_symname = link_buf.lb_buf;
3388         } else if S_ISREG(la->la_mode) {
3389                 /* retrieve lov of the old object */
3390                 rc = mdd_get_lov_ea(env, mdd_sobj, &lmm_buf);
3391                 if (rc != 0 && rc != -ENODATA)
3392                         RETURN(rc);
3393                 if (lmm_buf.lb_buf != NULL && lmm_buf.lb_len != 0) {
3394                         spec->u.sp_ea.eadata = lmm_buf.lb_buf;
3395                         spec->u.sp_ea.eadatalen = lmm_buf.lb_len;
3396                         spec->sp_cr_flags |= MDS_OPEN_HAS_EA;
3397                 }
3398         }
3399
3400         mgr_ea = (struct lmv_mds_md_v1 *)info->mti_xattr_buf;
3401         memset(mgr_ea, 0, sizeof(*mgr_ea));
3402         mgr_ea->lmv_magic = cpu_to_le32(LMV_MAGIC_V1);
3403         mgr_ea->lmv_stripe_count = cpu_to_le32(2);
3404         mgr_ea->lmv_master_mdt_index = mdd_seq_site(mdd)->ss_node_id;
3405         mgr_ea->lmv_hash_type = cpu_to_le32(LMV_HASH_FLAG_MIGRATION);
3406         fid_cpu_to_le(&mgr_ea->lmv_stripe_fids[0], mdd_object_fid(mdd_sobj));
3407         fid_cpu_to_le(&mgr_ea->lmv_stripe_fids[1], mdd_object_fid(mdd_tobj));
3408
3409         mdd_object_make_hint(env, mdd_pobj, mdd_tobj, la, spec, hint);
3410
3411         handle = mdd_trans_create(env, mdd);
3412         if (IS_ERR(handle))
3413                 GOTO(out_free, rc = PTR_ERR(handle));
3414
3415         /* Note: this transaction is part of migration, and it is not
3416          * the last step of migration, so we set th_local = 1 to avoid
3417          * update last rcvd for this transaction */
3418         handle->th_local = 1;
3419         rc = mdd_declare_migrate_create(env, mdd_pobj, mdd_sobj, mdd_tobj,
3420                                         spec, la,
3421                                         (union lmv_mds_md *)info->mti_xattr_buf,
3422                                         handle);
3423         if (rc != 0)
3424                 GOTO(stop_trans, rc);
3425
3426         rc = mdd_trans_start(env, mdd, handle);
3427         if (rc != 0)
3428                 GOTO(stop_trans, rc);
3429
3430         /* create the target object */
3431         rc = mdd_object_create(env, mdd_pobj, mdd_tobj, la, spec, NULL, NULL,
3432                                hint, handle);
3433         if (rc != 0)
3434                 GOTO(stop_trans, rc);
3435
3436         /* Set MIGRATE EA on the source inode, so once the migration needs
3437          * to be re-done during failover, the re-do process can locate the
3438          * target object which is already being created. */
3439         mgr_easize = lmv_mds_md_size(2, LMV_MAGIC_V1);
3440         buf = mdd_buf_get_const(env, mgr_ea, mgr_easize);
3441         rc = mdo_xattr_set(env, mdd_sobj, buf, XATTR_NAME_LMV, 0,
3442                            handle, mdd_object_capa(env, mdd_sobj));
3443         if (rc != 0)
3444                 GOTO(stop_trans, rc);
3445
3446         /* Set immutable flag, so any modification is disabled until
3447          * the migration is done. Once the migration is interrupted,
3448          * if the resume process find the migrating object has both
3449          * IMMUTALBE flag and MIGRATE EA, it need to clear IMMUTABLE
3450          * flag and approve the migration */
3451         la_flag->la_valid = LA_FLAGS;
3452         la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL;
3453         mdd_flags_xlate(mdd_sobj, la_flag->la_flags);
3454         rc = mdo_attr_set(env, mdd_sobj, la_flag, handle,
3455                           mdd_object_capa(env, mdd_sobj));
3456 stop_trans:
3457         if (handle != NULL)
3458                 mdd_trans_stop(env, mdd, rc, handle);
3459 out_free:
3460         if (lmm_buf.lb_buf != NULL)
3461                 OBD_FREE(lmm_buf.lb_buf, lmm_buf.lb_len);
3462         RETURN(rc);
3463 }
3464
3465 static int mdd_migrate_entries(const struct lu_env *env,
3466                                struct mdd_object *mdd_sobj,
3467                                struct mdd_object *mdd_tobj)
3468 {
3469         struct dt_object        *next = mdd_object_child(mdd_sobj);
3470         struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3471         struct dt_object        *dt_tobj = mdd_object_child(mdd_tobj);
3472         struct thandle          *handle;
3473         struct dt_it            *it;
3474         const struct dt_it_ops  *iops;
3475         int                      rc;
3476         int                      result;
3477         struct lu_dirent        *ent;
3478         ENTRY;
3479
3480         OBD_ALLOC(ent, NAME_MAX + sizeof(*ent) + 1);
3481         if (ent == NULL)
3482                 RETURN(-ENOMEM);
3483
3484         if (!dt_try_as_dir(env, next))
3485                 GOTO(out_ent, rc = -ENOTDIR);
3486         /*
3487          * iterate directories
3488          */
3489         iops = &next->do_index_ops->dio_it;
3490         it = iops->init(env, next, LUDA_FID | LUDA_TYPE,
3491                         mdd_object_capa(env, mdd_sobj));
3492         if (IS_ERR(it))
3493                 GOTO(out_ent, rc = PTR_ERR(it));
3494
3495         rc = iops->load(env, it, 0);
3496         if (rc == 0)
3497                 rc = iops->next(env, it);
3498         else if (rc > 0)
3499                 rc = 0;
3500         /*
3501          * At this point and across for-loop:
3502          *
3503          *  rc == 0 -> ok, proceed.
3504          *  rc >  0 -> end of directory.
3505          *  rc <  0 -> error.
3506          */
3507         do {
3508                 struct mdd_object       *child;
3509                 char                    *name = mdd_env_info(env)->mti_key;
3510                 int                     len;
3511                 int                     recsize;
3512                 int                     is_dir;
3513                 bool                    target_exist = false;
3514
3515                 len = iops->key_size(env, it);
3516                 if (len == 0)
3517                         goto next;
3518
3519                 result = iops->rec(env, it, (struct dt_rec *)ent,
3520                                    LUDA_FID | LUDA_TYPE);
3521                 if (result == -ESTALE)
3522                         goto next;
3523                 if (result != 0) {
3524                         rc = result;
3525                         goto out;
3526                 }
3527
3528                 fid_le_to_cpu(&ent->lde_fid, &ent->lde_fid);
3529                 recsize = le16_to_cpu(ent->lde_reclen);
3530
3531                 /* Insert new fid with target name into target dir */
3532                 if ((ent->lde_namelen == 1 && ent->lde_name[0] == '.') ||
3533                     (ent->lde_namelen == 2 && ent->lde_name[0] == '.' &&
3534                      ent->lde_name[1] == '.'))
3535                         goto next;
3536
3537                 child = mdd_object_find(env, mdd, &ent->lde_fid);
3538                 if (IS_ERR(child))
3539                         GOTO(out, rc = PTR_ERR(child));
3540
3541                 is_dir = S_ISDIR(mdd_object_type(child));
3542
3543                 snprintf(name, ent->lde_namelen + 1, "%s", ent->lde_name);
3544
3545                 /* Check whether the name has been inserted to the target */
3546                 if (dt_try_as_dir(env, dt_tobj)) {
3547                         struct lu_fid *fid = &mdd_env_info(env)->mti_fid2;
3548
3549                         rc = dt_tobj->do_index_ops->dio_lookup(env, dt_tobj,
3550                                                          (struct dt_rec *)fid,
3551                                                          (struct dt_key *)name,
3552                                                 mdd_object_capa(env, mdd_tobj));
3553                         if (unlikely(rc == 0))
3554                                 target_exist = true;
3555                 }
3556
3557                 handle = mdd_trans_create(env, mdd);
3558                 if (IS_ERR(handle))
3559                         GOTO(out, rc = PTR_ERR(handle));
3560
3561                 /* Note: this transaction is part of migration, and it is not
3562                  * the last step of migration, so we set th_local = 1 to avoid
3563                  * updating last rcvd for this transaction */
3564                 handle->th_local = 1;
3565                 if (likely(!target_exist)) {
3566                         rc = mdo_declare_index_insert(env, mdd_tobj,
3567                                                       &ent->lde_fid,
3568                                                       mdd_object_type(child),
3569                                                       name, handle);
3570                         if (rc != 0)
3571                                 GOTO(out_put, rc);
3572
3573                         if (is_dir) {
3574                                 rc = mdo_declare_ref_add(env, mdd_tobj, handle);
3575                                 if (rc != 0)
3576                                         GOTO(out_put, rc);
3577                         }
3578                 }
3579
3580                 rc = mdo_declare_index_delete(env, mdd_sobj, name, handle);
3581                 if (rc != 0)
3582                         GOTO(out_put, rc);
3583
3584                 if (is_dir) {
3585                         rc = mdo_declare_ref_del(env, mdd_sobj, handle);
3586                         if (rc != 0)
3587                                 GOTO(out_put, rc);
3588
3589                         /* Update .. for child */
3590                         rc = mdo_declare_index_delete(env, child, dotdot,
3591                                                       handle);
3592                         if (rc != 0)
3593                                 GOTO(out_put, rc);
3594
3595                         rc = mdo_declare_index_insert(env, child,
3596                                                       mdd_object_fid(mdd_tobj),
3597                                                       S_IFDIR, dotdot, handle);
3598                         if (rc != 0)
3599                                 GOTO(out_put, rc);
3600                 }
3601
3602                 rc = mdd_linkea_declare_update_child(env, mdd_tobj,
3603                                                      child, name,
3604                                                      strlen(name),
3605                                                      handle);
3606                 if (rc != 0)
3607                         GOTO(out_put, rc);
3608
3609                 rc = mdd_trans_start(env, mdd, handle);
3610                 if (rc != 0) {
3611                         CERROR("%s: transaction start failed: rc = %d\n",
3612                                mdd2obd_dev(mdd)->obd_name, rc);
3613                         GOTO(out_put, rc);
3614                 }
3615
3616                 if (likely(!target_exist)) {
3617                         rc = __mdd_index_insert(env, mdd_tobj, &ent->lde_fid,
3618                                                 mdd_object_type(child),
3619                                                 name, handle,
3620                                                 mdd_object_capa(env, mdd_tobj));
3621                         if (rc != 0)
3622                                 GOTO(out_put, rc);
3623
3624                         if (is_dir) {
3625                                 rc = mdo_ref_add(env, mdd_tobj, handle);
3626                                 if (rc != 0)
3627                                         GOTO(out_put, rc);
3628
3629                         }
3630                 }
3631
3632                 rc = __mdd_index_delete(env, mdd_sobj, name, is_dir, handle,
3633                                         mdd_object_capa(env, mdd_sobj));
3634                 if (rc != 0)
3635                         GOTO(out_put, rc);
3636
3637                 if (is_dir) {
3638                         rc = __mdd_index_delete_only(env, child, dotdot, handle,
3639                                                    mdd_object_capa(env, child));
3640                         if (rc != 0)
3641                                 GOTO(out_put, rc);
3642
3643                         rc = __mdd_index_insert_only(env, child,
3644                                          mdd_object_fid(mdd_tobj), S_IFDIR,
3645                                          dotdot, handle,
3646                                          mdd_object_capa(env, child));
3647                         if (rc != 0)
3648                                 GOTO(out_put, rc);
3649                 }
3650
3651                 rc = mdd_linkea_update_child(env, mdd_tobj, child, name,
3652                                              strlen(name), handle);
3653
3654 out_put:
3655                 mdd_object_put(env, child);
3656                 mdd_trans_stop(env, mdd, rc, handle);
3657                 if (rc != 0)
3658                         GOTO(out, rc);
3659 next:
3660                 result = iops->next(env, it);
3661                 if (OBD_FAIL_CHECK(OBD_FAIL_MIGRATE_ENTRIES))
3662                         GOTO(out, rc = -EINTR);
3663
3664                 if (result == -ESTALE)
3665                         goto next;
3666         } while (result == 0);
3667 out:
3668         iops->put(env, it);
3669         iops->fini(env, it);
3670 out_ent:
3671         OBD_FREE(ent, NAME_MAX + sizeof(*ent) + 1);
3672         RETURN(rc);
3673 }
3674
3675 static int mdd_declare_update_linkea(const struct lu_env *env,
3676                                      struct mdd_object *mdd_pobj,
3677                                      struct mdd_object *mdd_sobj,
3678                                      struct mdd_object *mdd_tobj,
3679                                      struct thandle *handle,
3680                                      const struct lu_name *child_name)
3681 {
3682         return mdd_update_linkea_internal(env, mdd_pobj, mdd_sobj, mdd_tobj,
3683                                           child_name, handle, 1);
3684 }
3685
3686 static int mdd_update_linkea(const struct lu_env *env,
3687                              struct mdd_object *mdd_pobj,
3688                              struct mdd_object *mdd_sobj,
3689                              struct mdd_object *mdd_tobj,
3690                              struct thandle *handle,
3691                              const struct lu_name *child_name)
3692 {
3693         return mdd_update_linkea_internal(env, mdd_pobj, mdd_sobj, mdd_tobj,
3694                                           child_name, handle, 0);
3695 }
3696
3697 static int mdd_declare_migrate_update_name(const struct lu_env *env,
3698                                            struct mdd_object *mdd_pobj,
3699                                            struct mdd_object *mdd_sobj,
3700                                            struct mdd_object *mdd_tobj,
3701                                            const struct lu_name *lname,
3702                                            struct lu_attr *la,
3703                                            struct lu_attr *parent_la,
3704                                            struct thandle *handle)
3705 {
3706         struct lu_attr  *la_flag = MDD_ENV_VAR(env, tattr);
3707         int             rc;
3708
3709         /* Revert IMMUTABLE flag */
3710         la_flag->la_valid = LA_FLAGS;
3711         la_flag->la_flags = la->la_flags & ~LUSTRE_IMMUTABLE_FL;
3712         mdd_flags_xlate(mdd_sobj, la_flag->la_flags);
3713         rc = mdo_declare_attr_set(env, mdd_sobj, la_flag, handle);
3714         if (rc != 0)
3715                 return rc;
3716
3717         /* delete entry from source dir */
3718         rc = mdo_declare_index_delete(env, mdd_pobj, lname->ln_name, handle);
3719         if (rc != 0)
3720                 return rc;
3721
3722         rc = mdd_declare_update_linkea(env, mdd_pobj, mdd_sobj,
3723                                        mdd_tobj, handle, lname);
3724         if (rc != 0)
3725                 return rc;
3726
3727         if (S_ISREG(mdd_object_type(mdd_sobj))) {
3728                 rc = mdo_declare_xattr_del(env, mdd_sobj, XATTR_NAME_LOV,
3729                                            handle);
3730                 if (rc != 0)
3731                         return rc;
3732         }
3733
3734         if (S_ISDIR(mdd_object_type(mdd_sobj))) {
3735                 rc = mdo_declare_ref_del(env, mdd_pobj, handle);
3736                 if (rc != 0)
3737                         return rc;
3738         }
3739
3740         /* new name */
3741         rc = mdo_declare_index_insert(env, mdd_pobj, mdo2fid(mdd_tobj),
3742                                       mdd_object_type(mdd_tobj),
3743                                       lname->ln_name, handle);
3744         if (rc != 0)
3745                 return rc;
3746
3747         if (S_ISDIR(mdd_object_type(mdd_sobj))) {
3748                 rc = mdo_declare_ref_add(env, mdd_pobj, handle);
3749                 if (rc != 0)
3750                         return rc;
3751         }
3752
3753         /* delete old object */
3754         rc = mdo_declare_ref_del(env, mdd_sobj, handle);
3755         if (rc != 0)
3756                 return rc;
3757
3758         if (S_ISDIR(mdd_object_type(mdd_sobj))) {
3759                 /* delete old object */
3760                 rc = mdo_declare_ref_del(env, mdd_sobj, handle);
3761                 if (rc != 0)
3762                         return rc;
3763                 /* set nlink to 0 */
3764                 rc = mdo_declare_attr_set(env, mdd_sobj, la, handle);
3765                 if (rc != 0)
3766                         return rc;
3767         }
3768
3769         rc = mdd_declare_finish_unlink(env, mdd_sobj, handle);
3770         if (rc)
3771                 return rc;
3772
3773         rc = mdo_declare_attr_set(env, mdd_pobj, parent_la, handle);
3774
3775         return rc;
3776 }
3777
3778 static int mdd_migrate_update_name(const struct lu_env *env,
3779                                    struct mdd_object *mdd_pobj,
3780                                    struct mdd_object *mdd_sobj,
3781                                    struct mdd_object *mdd_tobj,
3782                                    const struct lu_name *lname,
3783                                    struct md_attr *ma)
3784 {
3785         struct lu_attr          *p_la = MDD_ENV_VAR(env, la_for_fix);
3786         struct lu_attr          *so_attr = MDD_ENV_VAR(env, cattr);
3787         struct lu_attr          *la_flag = MDD_ENV_VAR(env, tattr);
3788         struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3789         struct thandle          *handle;
3790         int                     is_dir = S_ISDIR(mdd_object_type(mdd_sobj));
3791         const char              *name = lname->ln_name;
3792         int                     rc;
3793         ENTRY;
3794
3795         /* update time for parent */
3796         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
3797         p_la->la_ctime = p_la->la_mtime = ma->ma_attr.la_ctime;
3798         p_la->la_valid = LA_CTIME;
3799
3800         rc = mdd_la_get(env, mdd_sobj, so_attr, mdd_object_capa(env, mdd_sobj));
3801         if (rc != 0)
3802                 RETURN(rc);
3803
3804         handle = mdd_trans_create(env, mdd);
3805         if (IS_ERR(handle))
3806                 RETURN(PTR_ERR(handle));
3807
3808         rc = mdd_declare_migrate_update_name(env, mdd_pobj, mdd_sobj, mdd_tobj,
3809                                              lname, so_attr, p_la, handle);
3810         if (rc != 0) {
3811                 /* If the migration can not be fit in one transaction, just
3812                  * leave it in the original MDT */
3813                 if (rc == -E2BIG)
3814                         GOTO(stop_trans, rc = 0);
3815                 else
3816                         GOTO(stop_trans, rc);
3817         }
3818
3819         CDEBUG(D_INFO, "%s: update "DFID"/"DFID" with %s:"DFID"\n",
3820                mdd2obd_dev(mdd)->obd_name, PFID(mdd_object_fid(mdd_pobj)),
3821                PFID(mdd_object_fid(mdd_sobj)), lname->ln_name,
3822                PFID(mdd_object_fid(mdd_tobj)));
3823
3824         rc = mdd_trans_start(env, mdd, handle);
3825         if (rc != 0)
3826                 GOTO(stop_trans, rc);
3827
3828         /* Revert IMMUTABLE flag */
3829         la_flag->la_valid = LA_FLAGS;
3830         la_flag->la_flags = so_attr->la_flags & ~LUSTRE_IMMUTABLE_FL;
3831         mdd_flags_xlate(mdd_sobj, la_flag->la_flags);
3832         rc = mdo_attr_set(env, mdd_sobj, la_flag, handle,
3833                           mdd_object_capa(env, mdd_pobj));
3834         if (rc != 0)
3835                 GOTO(stop_trans, rc);
3836
3837         /* Remove source name from source directory */
3838         rc = __mdd_index_delete(env, mdd_pobj, name, is_dir, handle,
3839                                 mdd_object_capa(env, mdd_pobj));
3840         if (rc != 0)
3841                 GOTO(stop_trans, rc);
3842
3843         rc = mdd_update_linkea(env, mdd_pobj, mdd_sobj, mdd_tobj,
3844                                handle, lname);
3845         if (rc != 0)
3846                 GOTO(stop_trans, rc);
3847
3848         if (S_ISREG(so_attr->la_mode)) {
3849                 if (so_attr->la_nlink == 1) {
3850                         rc = mdo_xattr_del(env, mdd_sobj, XATTR_NAME_LOV,
3851                                            handle,
3852                                            mdd_object_capa(env, mdd_sobj));
3853                         if (rc != 0 && rc != -ENODATA)
3854                                 GOTO(stop_trans, rc);
3855                 }
3856         }
3857
3858         /* Insert new fid with target name into target dir */
3859         rc = __mdd_index_insert(env, mdd_pobj, mdd_object_fid(mdd_tobj),
3860                                 mdd_object_type(mdd_tobj), name,
3861                                 handle, mdd_object_capa(env, mdd_pobj));
3862         if (rc != 0)
3863                 GOTO(stop_trans, rc);
3864
3865         rc = mdd_links_add(env, mdd_tobj, mdo2fid(mdd_pobj), lname, handle,
3866                            NULL, 1);
3867         if (rc != 0)
3868                 GOTO(stop_trans, rc);
3869
3870         mdd_write_lock(env, mdd_sobj, MOR_SRC_CHILD);
3871         mdo_ref_del(env, mdd_sobj, handle);
3872         if (is_dir)
3873                 mdo_ref_del(env, mdd_sobj, handle);
3874
3875         /* Get the attr again after ref_del */
3876         rc = mdd_la_get(env, mdd_sobj, so_attr,
3877                         mdd_object_capa(env, mdd_sobj));
3878         if (rc != 0)
3879                 GOTO(stop_trans, rc);
3880         ma->ma_attr = *so_attr;
3881         ma->ma_valid |= MA_INODE;
3882         rc = mdd_finish_unlink(env, mdd_sobj, ma, mdd_pobj, lname, handle);
3883         if (rc != 0)
3884                 GOTO(stop_trans, rc);
3885
3886         rc = mdd_attr_set_internal(env, mdd_pobj, p_la, handle, 0);
3887         if (rc != 0)
3888                 GOTO(stop_trans, rc);
3889
3890         mdd_write_unlock(env, mdd_sobj);
3891
3892 stop_trans:
3893         mdd_trans_stop(env, mdd, rc, handle);
3894
3895         RETURN(rc);
3896 }
3897
3898 /**
3899  * Check whether we should migrate the file/dir
3900  * return val
3901  *      < 0  permission check failed or other error.
3902  *      = 0  the file can be migrated.
3903  *      > 0  the file does not need to be migrated, mostly
3904  *           for multiple link file
3905  **/
3906 static int mdd_migrate_sanity_check(const struct lu_env *env,
3907                                     struct mdd_object *pobj,
3908                                     const struct lu_attr *pattr,
3909                                     struct mdd_object *sobj,
3910                                     struct lu_attr *sattr)
3911 {
3912         struct mdd_thread_info  *info = mdd_env_info(env);
3913         struct linkea_data      *ldata = &info->mti_link_data;
3914         int                     mgr_easize;
3915         struct lu_buf           *mgr_buf;
3916         int                     count;
3917         int                     rc;
3918
3919         ENTRY;
3920
3921         mgr_easize = lmv_mds_md_size(2, LMV_MAGIC_V1);
3922         mgr_buf = lu_buf_check_and_alloc(&info->mti_big_buf, mgr_easize);
3923         if (mgr_buf->lb_buf == NULL)
3924                 RETURN(-ENOMEM);
3925
3926         rc = mdo_xattr_get(env, sobj, mgr_buf, XATTR_NAME_LMV,
3927                            mdd_object_capa(env, sobj));
3928         if (rc > 0) {
3929                 union lmv_mds_md *lmm = mgr_buf->lb_buf;
3930
3931                 /* If the object has migrateEA, it means IMMUTE flag
3932                  * is being set by previous migration process, so it
3933                  * needs to override the IMMUTE flag, otherwise the
3934                  * following sanity check will fail */
3935                 if (le32_to_cpu(lmm->lmv_md_v1.lmv_hash_type) &
3936                                                 LMV_HASH_FLAG_MIGRATION) {
3937                         struct mdd_device *mdd = mdo2mdd(&sobj->mod_obj);
3938
3939                         sattr->la_flags &= ~LUSTRE_IMMUTABLE_FL;
3940                         sobj->mod_flags &= ~IMMUTE_OBJ;
3941                         CDEBUG(D_HA, "%s: "DFID" override IMMUTE FLAG\n",
3942                                mdd2obd_dev(mdd)->obd_name,
3943                                PFID(mdd_object_fid(sobj)));
3944                 }
3945         }
3946
3947         rc = mdd_rename_sanity_check(env, pobj, pattr, pobj, pattr,
3948                                      sobj, sattr, NULL, NULL);
3949         if (rc != 0)
3950                 RETURN(rc);
3951
3952         /* Then it will check if the file should be migrated. If the file
3953          * has mulitple links, we only need migrate the file if all of its
3954          * entries has been migrated to the remote MDT */
3955         if (!S_ISREG(sattr->la_mode) || sattr->la_nlink < 2)
3956                 RETURN(0);
3957
3958         rc = mdd_links_read(env, sobj, ldata);
3959         if (rc != 0) {
3960                 /* For multiple links files, if there are no linkEA data at all,
3961                  * means the file might be created before linkEA is enabled, and
3962                  * all all of its links should not be migrated yet, otherwise
3963                  * it should have some linkEA there */
3964                 if (rc == -ENOENT || rc == -ENODATA)
3965                         RETURN(1);
3966                 RETURN(rc);
3967         }
3968
3969         /* If it is mulitple links file, we need update the name entry for
3970          * all parent */
3971         LASSERT(ldata->ld_leh != NULL);
3972         ldata->ld_lee = (struct link_ea_entry *)(ldata->ld_leh + 1);
3973         for (count = 0; count < ldata->ld_leh->leh_reccount; count++) {
3974                 struct mdd_device       *mdd = mdo2mdd(&sobj->mod_obj);
3975                 struct mdd_object       *lpobj;
3976                 struct lu_name          lname;
3977                 struct lu_fid           fid;
3978
3979                 linkea_entry_unpack(ldata->ld_lee, &ldata->ld_reclen,
3980                                     &lname, &fid);
3981                 ldata->ld_lee = (struct link_ea_entry *)((char *)ldata->ld_lee +
3982                                                          ldata->ld_reclen);
3983                 lpobj = mdd_object_find(env, mdd, &fid);
3984                 if (IS_ERR(lpobj)) {
3985                         CWARN("%s: cannot find obj "DFID": rc = %ld\n",
3986                               mdd2obd_dev(mdd)->obd_name, PFID(&fid),
3987                               PTR_ERR(lpobj));
3988                         continue;
3989                 }
3990
3991                 if (!mdd_object_exists(lpobj) || mdd_object_remote(lpobj)) {
3992                         CDEBUG(D_INFO, DFID"%.*s: is on remote MDT.\n",
3993                                PFID(&fid), lname.ln_namelen, lname.ln_name);
3994                         mdd_object_put(env, lpobj);
3995                         continue;
3996                 }
3997
3998                 CDEBUG(D_INFO, DFID"still has local entry %.*s "DFID"\n",
3999                        PFID(mdd_object_fid(sobj)), lname.ln_namelen,
4000                        lname.ln_name, PFID(&fid));
4001                 mdd_object_put(env, lpobj);
4002                 rc = 1;
4003                 break;
4004         }
4005
4006         RETURN(rc);
4007 }
4008
4009 static int mdd_migrate(const struct lu_env *env, struct md_object *pobj,
4010                        struct md_object *sobj, const struct lu_name *lname,
4011                        struct md_object *tobj, struct md_attr *ma)
4012 {
4013         struct mdd_object       *mdd_pobj = md2mdd_obj(pobj);
4014         struct mdd_device       *mdd = mdo2mdd(pobj);
4015         struct mdd_object       *mdd_sobj = md2mdd_obj(sobj);
4016         struct mdd_object       *mdd_tobj = NULL;
4017         struct lu_attr          *so_attr = MDD_ENV_VAR(env, cattr);
4018         struct lu_attr          *pattr = MDD_ENV_VAR(env, pattr);
4019         int                     rc;
4020
4021         ENTRY;
4022         /* If the file will being migrated, it will check whether
4023          * the file is being opened by someone else right now */
4024         mdd_read_lock(env, mdd_sobj, MOR_SRC_CHILD);
4025         if (mdd_sobj->mod_count >= 1) {
4026                 CERROR("%s: "DFID"%s is already opened count %d: rc = %d\n",
4027                        mdd2obd_dev(mdd)->obd_name,
4028                        PFID(mdd_object_fid(mdd_sobj)), lname->ln_name,
4029                        mdd_sobj->mod_count, -EBUSY);
4030                 mdd_read_unlock(env, mdd_sobj);
4031                 GOTO(put, rc = -EBUSY);
4032         }
4033         mdd_read_unlock(env, mdd_sobj);
4034
4035         rc = mdd_la_get(env, mdd_sobj, so_attr, mdd_object_capa(env, mdd_sobj));
4036         if (rc != 0)
4037                 GOTO(put, rc);
4038
4039         rc = mdd_la_get(env, mdd_pobj, pattr, BYPASS_CAPA);
4040         if (rc != 0)
4041                 GOTO(put, rc);
4042
4043         rc = mdd_migrate_sanity_check(env, mdd_pobj, pattr, mdd_sobj, so_attr);
4044         if (rc != 0) {
4045                 if (rc > 0)
4046                         rc = 0;
4047                 GOTO(put, rc);
4048         }
4049
4050         /* Sigh, it is impossible to finish all of migration in a single
4051          * transaction, for example migrating big directory entries to the
4052          * new MDT, it needs insert all of name entries of children in the
4053          * new directory.
4054          *
4055          * So migration will be done in multiple steps and transactions.
4056          *
4057          * 1. create an orphan object on the remote MDT in one transaction.
4058          * 2. migrate extend attributes to the new target file/directory.
4059          * 3. For directory, migrate the entries to the new MDT and update
4060          * linkEA of each children. Because we can not migrate all entries
4061          * in a single transaction, so the migrating directory will become
4062          * a striped directory during migration, so once the process is
4063          * interrupted, the directory is still accessible. (During lookup,
4064          * client will locate the name by searching both original and target
4065          * object).
4066          * 4. Finally, update the name/FID to point to the new file/directory
4067          * in a separate transaction.
4068          */
4069
4070         /* step 1: Check whether the orphan object has been created, and create
4071          * orphan object on the remote MDT if needed */
4072         mdd_tobj = md2mdd_obj(tobj);
4073         if (!mdd_object_exists(mdd_tobj)) {
4074                 rc = mdd_migrate_create(env, mdd_pobj, mdd_sobj, mdd_tobj,
4075                                         so_attr);
4076                 if (rc != 0)
4077                         GOTO(put, rc);
4078         }
4079
4080         /* step 2: migrate xattr */
4081         rc = mdd_migrate_xattrs(env, mdd_sobj, mdd_tobj);
4082         if (rc != 0)
4083                 GOTO(put, rc);
4084
4085         /* step 3: migrate name entries to the orphan object */
4086         if (S_ISDIR(lu_object_attr(&mdd_sobj->mod_obj.mo_lu))) {
4087                 rc = mdd_migrate_entries(env, mdd_sobj, mdd_tobj);
4088                 if (rc != 0)
4089                         GOTO(put, rc);
4090                 if (unlikely(OBD_FAIL_CHECK_RESET(OBD_FAIL_MIGRATE_NET_REP,
4091                                                   OBD_FAIL_MDS_REINT_NET_REP)))
4092                         GOTO(put, rc = 0);
4093         }
4094
4095         /* step 4: update name entry to the new object */
4096         rc = mdd_migrate_update_name(env, mdd_pobj, mdd_sobj, mdd_tobj, lname,
4097                                      ma);
4098         if (rc != 0)
4099                 GOTO(put, rc);
4100 put:
4101         RETURN(rc);
4102 }
4103
4104 const struct md_dir_operations mdd_dir_ops = {
4105         .mdo_is_subdir     = mdd_is_subdir,
4106         .mdo_lookup        = mdd_lookup,
4107         .mdo_create        = mdd_create,
4108         .mdo_rename        = mdd_rename,
4109         .mdo_link          = mdd_link,
4110         .mdo_unlink        = mdd_unlink,
4111         .mdo_create_data   = mdd_create_data,
4112         .mdo_migrate       = mdd_migrate,
4113 };