Whamcloud - gitweb
LU-5099 api: transfer object type via dt_insert API
[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                 rc = mdo_declare_index_insert(env, child, mdo2fid(child),
1828                                               S_IFDIR, dot, handle);
1829                 if (rc == 0)
1830                         rc = mdo_declare_ref_add(env, child, handle);
1831
1832                 rc = mdo_declare_index_insert(env, child, mdo2fid(parent),
1833                                               S_IFDIR, dotdot, handle);
1834         }
1835
1836         RETURN(rc);
1837 }
1838
1839 static int mdd_object_initialize(const struct lu_env *env,
1840                                  const struct lu_fid *pfid,
1841                                  struct mdd_object *child,
1842                                  struct lu_attr *attr, struct thandle *handle,
1843                                  const struct md_op_spec *spec)
1844 {
1845         int rc;
1846         ENTRY;
1847
1848         /*
1849          * Update attributes for child.
1850          *
1851          * FIXME:
1852          *  (1) the valid bits should be converted between Lustre and Linux;
1853          *  (2) maybe, the child attributes should be set in OSD when creation.
1854          */
1855
1856         rc = mdd_attr_set_internal(env, child, attr, handle, 0);
1857         /* arguments are supposed to stay the same */
1858         if (S_ISDIR(attr->la_mode)) {
1859                 /* Add "." and ".." for newly created dir */
1860                 mdo_ref_add(env, child, handle);
1861                 rc = __mdd_index_insert_only(env, child, mdo2fid(child),
1862                                              S_IFDIR, dot, handle, BYPASS_CAPA);
1863                 if (rc == 0)
1864                         rc = __mdd_index_insert_only(env, child, pfid, S_IFDIR,
1865                                                      dotdot, handle,
1866                                                      BYPASS_CAPA);
1867                 if (rc != 0)
1868                         mdo_ref_del(env, child, handle);
1869         }
1870
1871         RETURN(rc);
1872 }
1873
1874 /**
1875  * This function checks whether it can create a file/dir under the
1876  * directory(@pobj). The directory(@pobj) is not being locked by
1877  * mdd lock.
1878  *
1879  * \param[in] env       execution environment
1880  * \param[in] pobj      the directory to create files
1881  * \param[in] pattr     the attributes of the directory
1882  * \param[in] lname     the name of the created file/dir
1883  * \param[in] cattr     the attributes of the file/dir
1884  * \param[in] spec      create specification
1885  *
1886  * \retval              = 0 it is allowed to create file/dir under
1887  *                      the directory
1888  * \retval              negative error not allowed to create file/dir
1889  *                      under the directory
1890  */
1891 static int mdd_create_sanity_check(const struct lu_env *env,
1892                                    struct md_object *pobj,
1893                                    const struct lu_attr *pattr,
1894                                    const struct lu_name *lname,
1895                                    struct lu_attr *cattr,
1896                                    struct md_op_spec *spec)
1897 {
1898         struct mdd_thread_info *info = mdd_env_info(env);
1899         struct lu_fid     *fid       = &info->mti_fid;
1900         struct mdd_object *obj       = md2mdd_obj(pobj);
1901         struct mdd_device *m         = mdo2mdd(pobj);
1902         bool            check_perm = true;
1903         int rc;
1904         ENTRY;
1905
1906         /* EEXIST check */
1907         if (mdd_is_dead_obj(obj))
1908                 RETURN(-ENOENT);
1909
1910         /*
1911          * In some cases this lookup is not needed - we know before if name
1912          * exists or not because MDT performs lookup for it.
1913          * name length check is done in lookup.
1914          */
1915         if (spec->sp_cr_lookup) {
1916                 /*
1917                  * Check if the name already exist, though it will be checked in
1918                  * _index_insert also, for avoiding rolling back if exists
1919                  * _index_insert.
1920                  */
1921                 rc = __mdd_lookup(env, pobj, pattr, lname, fid,
1922                                   MAY_WRITE | MAY_EXEC);
1923                 if (rc != -ENOENT)
1924                         RETURN(rc ? : -EEXIST);
1925
1926                 /* Permission is already being checked in mdd_lookup */
1927                 check_perm = false;
1928         }
1929
1930         rc = mdd_may_create(env, obj, pattr, NULL, check_perm);
1931         if (rc != 0)
1932                 RETURN(rc);
1933
1934         /* sgid check */
1935         if (pattr->la_mode & S_ISGID) {
1936                 cattr->la_gid = pattr->la_gid;
1937                 if (S_ISDIR(cattr->la_mode)) {
1938                         cattr->la_mode |= S_ISGID;
1939                         cattr->la_valid |= LA_MODE;
1940                 }
1941         }
1942
1943         rc = mdd_name_check(m, lname);
1944         if (rc < 0)
1945                 RETURN(rc);
1946
1947         switch (cattr->la_mode & S_IFMT) {
1948         case S_IFLNK: {
1949                 unsigned int symlen = strlen(spec->u.sp_symname) + 1;
1950
1951                 if (symlen > (1 << m->mdd_dt_conf.ddp_block_shift))
1952                         RETURN(-ENAMETOOLONG);
1953                 else
1954                         RETURN(0);
1955         }
1956         case S_IFDIR:
1957         case S_IFREG:
1958         case S_IFCHR:
1959         case S_IFBLK:
1960         case S_IFIFO:
1961         case S_IFSOCK:
1962                 rc = 0;
1963                 break;
1964         default:
1965                 rc = -EINVAL;
1966                 break;
1967         }
1968         RETURN(rc);
1969 }
1970
1971 static int mdd_declare_object_create(const struct lu_env *env,
1972                                      struct mdd_device *mdd,
1973                                      struct mdd_object *p, struct mdd_object *c,
1974                                      struct lu_attr *attr,
1975                                      struct thandle *handle,
1976                                      const struct md_op_spec *spec,
1977                                      struct lu_buf *def_acl_buf,
1978                                      struct lu_buf *acl_buf,
1979                                      struct dt_allocation_hint *hint)
1980 {
1981         int rc;
1982
1983         rc = mdd_declare_object_create_internal(env, p, c, attr, handle, spec,
1984                                                 hint);
1985         if (rc)
1986                 GOTO(out, rc);
1987
1988 #ifdef CONFIG_FS_POSIX_ACL
1989         if (def_acl_buf->lb_len > 0 && S_ISDIR(attr->la_mode)) {
1990                 /* if dir, then can inherit default ACl */
1991                 rc = mdo_declare_xattr_set(env, c, def_acl_buf,
1992                                            XATTR_NAME_ACL_DEFAULT,
1993                                            0, handle);
1994                 if (rc)
1995                         GOTO(out, rc);
1996         }
1997
1998         if (acl_buf->lb_len > 0) {
1999                 rc = mdo_declare_attr_set(env, c, attr, handle);
2000                 if (rc)
2001                         GOTO(out, rc);
2002
2003                 rc = mdo_declare_xattr_set(env, c, acl_buf,
2004                                            XATTR_NAME_ACL_ACCESS, 0, handle);
2005                 if (rc)
2006                         GOTO(out, rc);
2007         }
2008 #endif
2009         rc = mdd_declare_object_initialize(env, p, c, attr, handle);
2010         if (rc)
2011                 GOTO(out, rc);
2012
2013         /* replay case, create LOV EA from client data */
2014         if (spec->no_create ||
2015             (spec->sp_cr_flags & MDS_OPEN_HAS_EA && S_ISREG(attr->la_mode))) {
2016                 const struct lu_buf *buf;
2017
2018                 buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
2019                                         spec->u.sp_ea.eadatalen);
2020                 rc = mdo_declare_xattr_set(env, c, buf, XATTR_NAME_LOV, 0,
2021                                            handle);
2022                 if (rc)
2023                         GOTO(out, rc);
2024         }
2025
2026         if (S_ISLNK(attr->la_mode)) {
2027                 const char *target_name = spec->u.sp_symname;
2028                 int sym_len = strlen(target_name);
2029                 const struct lu_buf *buf;
2030
2031                 buf = mdd_buf_get_const(env, target_name, sym_len);
2032                 rc = dt_declare_record_write(env, mdd_object_child(c),
2033                                              buf, 0, handle);
2034                 if (rc)
2035                         GOTO(out, rc);
2036         }
2037 out:
2038         return rc;
2039 }
2040
2041 static int mdd_declare_create(const struct lu_env *env, struct mdd_device *mdd,
2042                               struct mdd_object *p, struct mdd_object *c,
2043                               const struct lu_name *name,
2044                               struct lu_attr *attr,
2045                               struct thandle *handle,
2046                               const struct md_op_spec *spec,
2047                               struct linkea_data *ldata,
2048                               struct lu_buf *def_acl_buf,
2049                               struct lu_buf *acl_buf,
2050                               struct dt_allocation_hint *hint)
2051 {
2052         int rc;
2053
2054         rc = mdd_declare_object_create(env, mdd, p, c, attr, handle, spec,
2055                                        def_acl_buf, acl_buf, hint);
2056         if (rc)
2057                 GOTO(out, rc);
2058
2059         if (S_ISDIR(attr->la_mode)) {
2060                 rc = mdo_declare_ref_add(env, p, handle);
2061                 if (rc)
2062                         GOTO(out, rc);
2063         }
2064
2065         if (unlikely(spec->sp_cr_flags & MDS_OPEN_VOLATILE)) {
2066                 rc = orph_declare_index_insert(env, c, attr->la_mode, handle);
2067                 if (rc)
2068                         GOTO(out, rc);
2069         } else {
2070                 struct lu_attr  *la = &mdd_env_info(env)->mti_la_for_fix;
2071
2072                 rc = mdo_declare_index_insert(env, p, mdo2fid(c), attr->la_mode,
2073                                               name->ln_name, handle);
2074                 if (rc != 0)
2075                         return rc;
2076
2077                 rc = mdd_declare_links_add(env, c, handle, ldata);
2078                 if (rc)
2079                         return rc;
2080
2081                 *la = *attr;
2082                 la->la_valid = LA_CTIME | LA_MTIME;
2083                 rc = mdo_declare_attr_set(env, p, la, handle);
2084                 if (rc)
2085                         return rc;
2086
2087                 rc = mdd_declare_changelog_store(env, mdd, name, handle);
2088                 if (rc)
2089                         return rc;
2090         }
2091
2092         /* XXX: For remote create, it should indicate the remote RPC
2093          * will be sent after local transaction is finished, which
2094          * is not very nice, but it will be removed once we fully support
2095          * async update */
2096         if (mdd_object_remote(p) && handle->th_update != NULL)
2097                 handle->th_update->tu_sent_after_local_trans = 1;
2098 out:
2099         return rc;
2100 }
2101
2102 static int mdd_acl_init(const struct lu_env *env, struct mdd_object *pobj,
2103                         struct lu_attr *la, struct lu_buf *def_acl_buf,
2104                         struct lu_buf *acl_buf)
2105 {
2106         int     rc;
2107         ENTRY;
2108
2109         if (S_ISLNK(la->la_mode)) {
2110                 acl_buf->lb_len = 0;
2111                 def_acl_buf->lb_len = 0;
2112                 RETURN(0);
2113         }
2114
2115         mdd_read_lock(env, pobj, MOR_TGT_PARENT);
2116         rc = mdo_xattr_get(env, pobj, def_acl_buf,
2117                            XATTR_NAME_ACL_DEFAULT, BYPASS_CAPA);
2118         mdd_read_unlock(env, pobj);
2119         if (rc > 0) {
2120                 /* If there are default ACL, fix mode/ACL by default ACL */
2121                 def_acl_buf->lb_len = rc;
2122                 LASSERT(def_acl_buf->lb_len <= acl_buf->lb_len);
2123                 memcpy(acl_buf->lb_buf, def_acl_buf->lb_buf, rc);
2124                 acl_buf->lb_len = rc;
2125                 rc = __mdd_fix_mode_acl(env, acl_buf, &la->la_mode);
2126                 if (rc < 0)
2127                         RETURN(rc);
2128         } else if (rc == -ENODATA || rc == -EOPNOTSUPP) {
2129                 /* If there are no default ACL, fix mode by mask */
2130                 struct lu_ucred *uc = lu_ucred(env);
2131
2132                 /* The create triggered by MDT internal events, such as
2133                  * LFSCK reset, will not contain valid "uc". */
2134                 if (unlikely(uc != NULL))
2135                         la->la_mode &= ~uc->uc_umask;
2136                 rc = 0;
2137                 acl_buf->lb_len = 0;
2138                 def_acl_buf->lb_len = 0;
2139         }
2140
2141         RETURN(rc);
2142 }
2143
2144 /**
2145  * Create a metadata object and initialize it, set acl, xattr.
2146  **/
2147 static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj,
2148                              struct mdd_object *son, struct lu_attr *attr,
2149                              struct md_op_spec *spec, struct lu_buf *acl_buf,
2150                              struct lu_buf *def_acl_buf,
2151                              struct dt_allocation_hint *hint,
2152                              struct thandle *handle)
2153 {
2154         int                     rc;
2155
2156         mdd_write_lock(env, son, MOR_TGT_CHILD);
2157         rc = mdd_object_create_internal(env, NULL, son, attr, handle, spec,
2158                                         hint);
2159         if (rc)
2160                 GOTO(unlock, rc);
2161
2162         /* Note: In DNE phase I, for striped dir, though sub-stripes will be
2163          * created in declare phase, they also needs to be added to master
2164          * object as sub-directory entry. So it has to initialize the master
2165          * object, then set dir striped EA.(in mdo_xattr_set) */
2166         rc = mdd_object_initialize(env, mdo2fid(pobj), son, attr, handle,
2167                                    spec);
2168         if (rc != 0)
2169                 GOTO(err_destroy, rc);
2170
2171         /*
2172          * in case of replay we just set LOVEA provided by the client
2173          * XXX: I think it would be interesting to try "old" way where
2174          *      MDT calls this xattr_set(LOV) in a different transaction.
2175          *      probably this way we code can be made better.
2176          */
2177
2178         /* During creation, there are only a few cases we need do xattr_set to
2179          * create stripes.
2180          * 1. regular file: see comments above.
2181          * 2. create striped directory with provided stripeEA.
2182          * 3. create striped directory because inherit default layout from the
2183          * parent. */
2184         if (spec->no_create ||
2185             (S_ISREG(attr->la_mode) && spec->sp_cr_flags & MDS_OPEN_HAS_EA) ||
2186             S_ISDIR(attr->la_mode)) {
2187                 const struct lu_buf *buf;
2188
2189                 buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
2190                                         spec->u.sp_ea.eadatalen);
2191                 rc = mdo_xattr_set(env, son, buf,
2192                                    S_ISDIR(attr->la_mode) ? XATTR_NAME_LMV :
2193                                                             XATTR_NAME_LOV, 0,
2194                                    handle, BYPASS_CAPA);
2195                 if (rc != 0)
2196                         GOTO(err_destroy, rc);
2197         }
2198
2199 #ifdef CONFIG_FS_POSIX_ACL
2200         if (def_acl_buf != NULL && def_acl_buf->lb_len > 0 &&
2201             S_ISDIR(attr->la_mode)) {
2202                 /* set default acl */
2203                 rc = mdo_xattr_set(env, son, def_acl_buf,
2204                                    XATTR_NAME_ACL_DEFAULT, 0,
2205                                    handle, BYPASS_CAPA);
2206                 if (rc)
2207                         GOTO(err_destroy, rc);
2208         }
2209         /* set its own acl */
2210         if (acl_buf != NULL && acl_buf->lb_len > 0) {
2211                 rc = mdo_xattr_set(env, son, acl_buf,
2212                                    XATTR_NAME_ACL_ACCESS,
2213                                    0, handle, BYPASS_CAPA);
2214                 if (rc)
2215                         GOTO(err_destroy, rc);
2216         }
2217 #endif
2218
2219         if (S_ISLNK(attr->la_mode)) {
2220                 struct lu_ucred  *uc = lu_ucred_assert(env);
2221                 struct dt_object *dt = mdd_object_child(son);
2222                 const char *target_name = spec->u.sp_symname;
2223                 int sym_len = strlen(target_name);
2224                 const struct lu_buf *buf;
2225                 loff_t pos = 0;
2226
2227                 buf = mdd_buf_get_const(env, target_name, sym_len);
2228                 rc = dt->do_body_ops->dbo_write(env, dt, buf, &pos, handle,
2229                                                 mdd_object_capa(env, son),
2230                                                 uc->uc_cap &
2231                                                 CFS_CAP_SYS_RESOURCE_MASK);
2232
2233                 if (rc == sym_len)
2234                         rc = 0;
2235                 else
2236                         GOTO(err_initlized, rc = -EFAULT);
2237         }
2238
2239 err_initlized:
2240         if (unlikely(rc != 0)) {
2241                 int rc2;
2242                 if (S_ISDIR(attr->la_mode)) {
2243                         /* Drop the reference, no need to delete "."/"..",
2244                          * because the object to be destroied directly. */
2245                         rc2 = mdo_ref_del(env, son, handle);
2246                         if (rc2 != 0)
2247                                 GOTO(unlock, rc);
2248                 }
2249                 rc2 = mdo_ref_del(env, son, handle);
2250                 if (rc2 != 0)
2251                         GOTO(unlock, rc);
2252 err_destroy:
2253                 mdo_destroy(env, son, handle);
2254         }
2255 unlock:
2256         mdd_write_unlock(env, son);
2257         RETURN(rc);
2258 }
2259
2260 /*
2261  * Create object and insert it into namespace.
2262  */
2263 static int mdd_create(const struct lu_env *env, struct md_object *pobj,
2264                       const struct lu_name *lname, struct md_object *child,
2265                       struct md_op_spec *spec, struct md_attr* ma)
2266 {
2267         struct mdd_thread_info  *info = mdd_env_info(env);
2268         struct lu_attr          *la = &info->mti_la_for_fix;
2269         struct mdd_object       *mdd_pobj = md2mdd_obj(pobj);
2270         struct mdd_object       *son = md2mdd_obj(child);
2271         struct mdd_device       *mdd = mdo2mdd(pobj);
2272         struct lu_attr          *attr = &ma->ma_attr;
2273         struct thandle          *handle;
2274         struct lu_attr          *pattr = &info->mti_pattr;
2275         struct lu_buf           acl_buf;
2276         struct lu_buf           def_acl_buf;
2277         struct linkea_data      *ldata = &info->mti_link_data;
2278         const char              *name = lname->ln_name;
2279         struct dt_allocation_hint *hint = &mdd_env_info(env)->mti_hint;
2280         int                      rc;
2281         int                      rc2;
2282         ENTRY;
2283
2284         /*
2285          * Two operations have to be performed:
2286          *
2287          *  - an allocation of a new object (->do_create()), and
2288          *
2289          *  - an insertion into a parent index (->dio_insert()).
2290          *
2291          * Due to locking, operation order is not important, when both are
2292          * successful, *but* error handling cases are quite different:
2293          *
2294          *  - if insertion is done first, and following object creation fails,
2295          *  insertion has to be rolled back, but this operation might fail
2296          *  also leaving us with dangling index entry.
2297          *
2298          *  - if creation is done first, is has to be undone if insertion
2299          *  fails, leaving us with leaked space, which is neither good, nor
2300          *  fatal.
2301          *
2302          * It seems that creation-first is simplest solution, but it is
2303          * sub-optimal in the frequent
2304          *
2305          *         $ mkdir foo
2306          *         $ mkdir foo
2307          *
2308          * case, because second mkdir is bound to create object, only to
2309          * destroy it immediately.
2310          *
2311          * To avoid this follow local file systems that do double lookup:
2312          *
2313          *     0. lookup -> -EEXIST (mdd_create_sanity_check())
2314          *
2315          *     1. create            (mdd_object_create_internal())
2316          *
2317          *     2. insert            (__mdd_index_insert(), lookup again)
2318          */
2319
2320         rc = mdd_la_get(env, mdd_pobj, pattr, BYPASS_CAPA);
2321         if (rc != 0)
2322                 RETURN(rc);
2323
2324         /* Sanity checks before big job. */
2325         rc = mdd_create_sanity_check(env, pobj, pattr, lname, attr, spec);
2326         if (rc)
2327                 RETURN(rc);
2328
2329         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_DQACQ_NET))
2330                 GOTO(out_free, rc = -EINPROGRESS);
2331
2332         handle = mdd_trans_create(env, mdd);
2333         if (IS_ERR(handle))
2334                 GOTO(out_free, rc = PTR_ERR(handle));
2335
2336         acl_buf.lb_buf = info->mti_xattr_buf;
2337         acl_buf.lb_len = sizeof(info->mti_xattr_buf);
2338         def_acl_buf.lb_buf = info->mti_key;
2339         def_acl_buf.lb_len = sizeof(info->mti_key);
2340         rc = mdd_acl_init(env, mdd_pobj, attr, &def_acl_buf, &acl_buf);
2341         if (rc < 0)
2342                 GOTO(out_stop, rc);
2343
2344         mdd_object_make_hint(env, mdd_pobj, son, attr, spec, hint);
2345
2346         memset(ldata, 0, sizeof(*ldata));
2347         rc = mdd_linkea_prepare(env, son, NULL, NULL,
2348                                 mdd_object_fid(mdd_pobj),
2349                                 lname, 1, 0, ldata);
2350
2351         rc = mdd_declare_create(env, mdd, mdd_pobj, son, lname, attr,
2352                                 handle, spec, ldata, &def_acl_buf, &acl_buf,
2353                                 hint);
2354         if (rc)
2355                 GOTO(out_stop, rc);
2356
2357         rc = mdd_trans_start(env, mdd, handle);
2358         if (rc)
2359                 GOTO(out_stop, rc);
2360
2361         rc = mdd_object_create(env, mdd_pobj, son, attr, spec, &acl_buf,
2362                                &def_acl_buf, hint, handle);
2363         if (rc != 0)
2364                 GOTO(out_stop, rc);
2365
2366         if (unlikely(spec->sp_cr_flags & MDS_OPEN_VOLATILE)) {
2367                 mdd_write_lock(env, son, MOR_TGT_CHILD);
2368                 rc = __mdd_orphan_add(env, son, handle);
2369                 GOTO(out_volatile, rc);
2370         } else {
2371                 rc = __mdd_index_insert(env, mdd_pobj, mdo2fid(son),
2372                                         attr->la_mode, name, handle,
2373                                         mdd_object_capa(env, mdd_pobj));
2374                 if (rc != 0)
2375                         GOTO(err_created, rc);
2376
2377                 mdd_links_add(env, son, mdo2fid(mdd_pobj), lname, handle,
2378                               ldata, 1);
2379
2380                 /* update parent directory mtime/ctime */
2381                 *la = *attr;
2382                 la->la_valid = LA_CTIME | LA_MTIME;
2383                 rc = mdd_update_time(env, mdd_pobj, pattr, la, handle);
2384                 if (rc)
2385                         GOTO(err_insert, rc);
2386         }
2387
2388         EXIT;
2389 err_insert:
2390         if (rc != 0) {
2391                 int rc2;
2392
2393                 if (spec->sp_cr_flags & MDS_OPEN_VOLATILE)
2394                         rc2 = __mdd_orphan_del(env, son, handle);
2395                 else
2396                         rc2 = __mdd_index_delete(env, mdd_pobj, name,
2397                                                  S_ISDIR(attr->la_mode),
2398                                                  handle, BYPASS_CAPA);
2399                 if (rc2 != 0)
2400                         goto out_stop;
2401
2402 err_created:
2403                 mdd_write_lock(env, son, MOR_TGT_CHILD);
2404                 if (S_ISDIR(attr->la_mode)) {
2405                         /* Drop the reference, no need to delete "."/"..",
2406                          * because the object is to be destroyed directly. */
2407                         rc2 = mdo_ref_del(env, son, handle);
2408                         if (rc2 != 0) {
2409                                 mdd_write_unlock(env, son);
2410                                 goto out_stop;
2411                         }
2412                 }
2413 out_volatile:
2414                 /* For volatile files drop one link immediately, since there is
2415                  * no filename in the namespace, and save any error returned. */
2416                 rc2 = mdo_ref_del(env, son, handle);
2417                 if (rc2 != 0) {
2418                         mdd_write_unlock(env, son);
2419                         if (unlikely(rc == 0))
2420                                 rc = rc2;
2421                         goto out_stop;
2422                 }
2423
2424                 /* Don't destroy the volatile object on success */
2425                 if (likely(rc != 0))
2426                         mdo_destroy(env, son, handle);
2427                 mdd_write_unlock(env, son);
2428         }
2429
2430         if (rc == 0 && fid_is_namespace_visible(mdo2fid(son)) &&
2431             likely((spec->sp_cr_flags & MDS_OPEN_VOLATILE) == 0))
2432                 rc = mdd_changelog_ns_store(env, mdd,
2433                                 S_ISDIR(attr->la_mode) ? CL_MKDIR :
2434                                 S_ISREG(attr->la_mode) ? CL_CREATE :
2435                                 S_ISLNK(attr->la_mode) ? CL_SOFTLINK : CL_MKNOD,
2436                                 0, son, mdd_pobj, lname, handle);
2437 out_stop:
2438         rc2 = mdd_trans_stop(env, mdd, rc, handle);
2439         if (rc == 0)
2440                 rc = rc2;
2441 out_free:
2442         if (ldata->ld_buf && ldata->ld_buf->lb_len > OBD_ALLOC_BIG)
2443                 /* if we vmalloced a large buffer drop it */
2444                 lu_buf_free(ldata->ld_buf);
2445
2446         /* The child object shouldn't be cached anymore */
2447         if (rc)
2448                 set_bit(LU_OBJECT_HEARD_BANSHEE,
2449                         &child->mo_lu.lo_header->loh_flags);
2450         return rc;
2451 }
2452
2453 /*
2454  * Get locks on parents in proper order
2455  * RETURN: < 0 - error, rename_order if successful
2456  */
2457 enum rename_order {
2458         MDD_RN_SAME,
2459         MDD_RN_SRCTGT,
2460         MDD_RN_TGTSRC
2461 };
2462
2463 static int mdd_rename_order(const struct lu_env *env,
2464                             struct mdd_device *mdd,
2465                             struct mdd_object *src_pobj,
2466                             const struct lu_attr *pattr,
2467                             struct mdd_object *tgt_pobj)
2468 {
2469         /* order of locking, 1 - tgt-src, 0 - src-tgt*/
2470         int rc;
2471         ENTRY;
2472
2473         if (src_pobj == tgt_pobj)
2474                 RETURN(MDD_RN_SAME);
2475
2476         /* compared the parent child relationship of src_p&tgt_p */
2477         if (lu_fid_eq(&mdd->mdd_root_fid, mdo2fid(src_pobj))){
2478                 rc = MDD_RN_SRCTGT;
2479         } else if (lu_fid_eq(&mdd->mdd_root_fid, mdo2fid(tgt_pobj))) {
2480                 rc = MDD_RN_TGTSRC;
2481         } else {
2482                 rc = mdd_is_parent(env, mdd, src_pobj, pattr, mdo2fid(tgt_pobj),
2483                                    NULL);
2484                 if (rc == -EREMOTE)
2485                         rc = 0;
2486
2487                 if (rc == 1)
2488                         rc = MDD_RN_TGTSRC;
2489                 else if (rc == 0)
2490                         rc = MDD_RN_SRCTGT;
2491         }
2492
2493         RETURN(rc);
2494 }
2495
2496 /* has not mdd_write{read}_lock on any obj yet. */
2497 static int mdd_rename_sanity_check(const struct lu_env *env,
2498                                    struct mdd_object *src_pobj,
2499                                    const struct lu_attr *pattr,
2500                                    struct mdd_object *tgt_pobj,
2501                                    const struct lu_attr *tpattr,
2502                                    struct mdd_object *sobj,
2503                                    const struct lu_attr *cattr,
2504                                    struct mdd_object *tobj,
2505                                    const struct lu_attr *tattr)
2506 {
2507         int rc = 0;
2508         ENTRY;
2509
2510         /* XXX: when get here, sobj must NOT be NULL,
2511          * the other case has been processed in cld_rename
2512          * before mdd_rename and enable MDS_PERM_BYPASS. */
2513         LASSERT(sobj);
2514
2515         rc = mdd_may_delete(env, src_pobj, pattr, sobj, cattr, NULL, 1, 0);
2516         if (rc)
2517                 RETURN(rc);
2518
2519         /* XXX: when get here, "tobj == NULL" means tobj must
2520          * NOT exist (neither on remote MDS, such case has been
2521          * processed in cld_rename before mdd_rename and enable
2522          * MDS_PERM_BYPASS).
2523          * So check may_create, but not check may_unlink. */
2524         if (tobj == NULL)
2525                 rc = mdd_may_create(env, tgt_pobj, tpattr, NULL,
2526                                     (src_pobj != tgt_pobj));
2527         else
2528                 rc = mdd_may_delete(env, tgt_pobj, tpattr, tobj, tattr, cattr,
2529                                     (src_pobj != tgt_pobj), 1);
2530
2531         if (!rc && !tobj && (src_pobj != tgt_pobj) && S_ISDIR(cattr->la_mode))
2532                 rc = __mdd_may_link(env, tgt_pobj, tpattr);
2533
2534         RETURN(rc);
2535 }
2536
2537 static int mdd_declare_rename(const struct lu_env *env,
2538                               struct mdd_device *mdd,
2539                               struct mdd_object *mdd_spobj,
2540                               struct mdd_object *mdd_tpobj,
2541                               struct mdd_object *mdd_sobj,
2542                               struct mdd_object *mdd_tobj,
2543                               const struct lu_name *tname,
2544                               const struct lu_name *sname,
2545                               struct md_attr *ma,
2546                               struct linkea_data *ldata,
2547                               struct thandle *handle)
2548 {
2549         struct lu_attr    *la = &mdd_env_info(env)->mti_la_for_fix;
2550         int rc;
2551
2552         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
2553         la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
2554
2555         LASSERT(mdd_spobj);
2556         LASSERT(mdd_tpobj);
2557         LASSERT(mdd_sobj);
2558
2559         /* name from source dir */
2560         rc = mdo_declare_index_delete(env, mdd_spobj, sname->ln_name, handle);
2561         if (rc)
2562                 return rc;
2563
2564         /* .. from source child */
2565         if (S_ISDIR(mdd_object_type(mdd_sobj))) {
2566                 /* source child can be directory,
2567                  * counted by source dir's nlink */
2568                 rc = mdo_declare_ref_del(env, mdd_spobj, handle);
2569                 if (rc)
2570                         return rc;
2571                 if (mdd_spobj != mdd_tpobj) {
2572                         rc = mdo_declare_index_delete(env, mdd_sobj, dotdot,
2573                                                       handle);
2574                         if (rc != 0)
2575                                 return rc;
2576
2577                         rc = mdo_declare_index_insert(env, mdd_sobj,
2578                                                       mdo2fid(mdd_tpobj),
2579                                                       S_IFDIR, dotdot, handle);
2580                         if (rc != 0)
2581                                 return rc;
2582                 }
2583
2584                 /* new target child can be directory,
2585                  * counted by target dir's nlink */
2586                 rc = mdo_declare_ref_add(env, mdd_tpobj, handle);
2587                 if (rc != 0)
2588                         return rc;
2589         }
2590
2591         la->la_valid = LA_CTIME | LA_MTIME;
2592         rc = mdo_declare_attr_set(env, mdd_spobj, la, handle);
2593         if (rc != 0)
2594                 return rc;
2595
2596         rc = mdo_declare_attr_set(env, mdd_tpobj, la, handle);
2597         if (rc != 0)
2598                 return rc;
2599
2600         la->la_valid = LA_CTIME;
2601         rc = mdo_declare_attr_set(env, mdd_sobj, la, handle);
2602         if (rc)
2603                 return rc;
2604
2605         rc = mdd_declare_links_add(env, mdd_sobj, handle, ldata);
2606         if (rc)
2607                 return rc;
2608
2609         /* new name */
2610         rc = mdo_declare_index_insert(env, mdd_tpobj, mdo2fid(mdd_sobj),
2611                                       mdd_object_type(mdd_sobj),
2612                                       tname->ln_name, handle);
2613         if (rc != 0)
2614                 return rc;
2615
2616         /* name from target dir (old name), we declare it unconditionally
2617          * as mdd_rename() calls delete unconditionally as well. so just
2618          * to balance declarations vs calls to change ... */
2619         rc = mdo_declare_index_delete(env, mdd_tpobj, tname->ln_name, handle);
2620         if (rc)
2621                 return rc;
2622
2623         if (mdd_tobj && mdd_object_exists(mdd_tobj)) {
2624                 /* delete target child in target parent directory */
2625                 rc = mdo_declare_ref_del(env, mdd_tobj, handle);
2626                 if (rc)
2627                         return rc;
2628
2629                 if (S_ISDIR(mdd_object_type(mdd_tobj))) {
2630                         /* target child can be directory,
2631                          * delete "." reference in target child directory */
2632                         rc = mdo_declare_ref_del(env, mdd_tobj, handle);
2633                         if (rc)
2634                                 return rc;
2635
2636                         /* delete ".." reference in target parent directory */
2637                         rc = mdo_declare_ref_del(env, mdd_tpobj, handle);
2638                         if (rc)
2639                                 return rc;
2640                 }
2641
2642                 la->la_valid = LA_CTIME;
2643                 rc = mdo_declare_attr_set(env, mdd_tobj, la, handle);
2644                 if (rc)
2645                         return rc;
2646
2647                 rc = mdd_declare_finish_unlink(env, mdd_tobj, handle);
2648                 if (rc)
2649                         return rc;
2650         }
2651
2652         rc = mdd_declare_changelog_ext_store(env, mdd, tname, sname, handle);
2653         if (rc)
2654                 return rc;
2655
2656         return rc;
2657 }
2658
2659 /* src object can be remote that is why we use only fid and type of object */
2660 static int mdd_rename(const struct lu_env *env,
2661                       struct md_object *src_pobj, struct md_object *tgt_pobj,
2662                       const struct lu_fid *lf, const struct lu_name *lsname,
2663                       struct md_object *tobj, const struct lu_name *ltname,
2664                       struct md_attr *ma)
2665 {
2666         const char *sname = lsname->ln_name;
2667         const char *tname = ltname->ln_name;
2668         struct lu_attr    *la = &mdd_env_info(env)->mti_la_for_fix;
2669         struct mdd_object *mdd_spobj = md2mdd_obj(src_pobj); /* source parent */
2670         struct mdd_object *mdd_tpobj = md2mdd_obj(tgt_pobj);
2671         struct mdd_device *mdd = mdo2mdd(src_pobj);
2672         struct mdd_object *mdd_sobj = NULL;                  /* source object */
2673         struct mdd_object *mdd_tobj = NULL;
2674         struct lu_attr *cattr = MDD_ENV_VAR(env, cattr);
2675         struct lu_attr *pattr = MDD_ENV_VAR(env, pattr);
2676         struct lu_attr *tattr = MDD_ENV_VAR(env, tattr);
2677         struct lu_attr *tpattr = MDD_ENV_VAR(env, tpattr);
2678         struct thandle *handle;
2679         struct linkea_data  *ldata = &mdd_env_info(env)->mti_link_data;
2680         const struct lu_fid *tpobj_fid = mdo2fid(mdd_tpobj);
2681         const struct lu_fid *spobj_fid = mdo2fid(mdd_spobj);
2682         bool is_dir;
2683         bool tobj_ref = 0;
2684         bool tobj_locked = 0;
2685         unsigned cl_flags = 0;
2686         int rc, rc2;
2687         ENTRY;
2688
2689         if (tobj)
2690                 mdd_tobj = md2mdd_obj(tobj);
2691
2692         mdd_sobj = mdd_object_find(env, mdd, lf);
2693
2694         rc = mdd_la_get(env, mdd_sobj, cattr, BYPASS_CAPA);
2695         if (rc)
2696                 GOTO(out_pending, rc);
2697
2698         rc = mdd_la_get(env, mdd_spobj, pattr, BYPASS_CAPA);
2699         if (rc)
2700                 GOTO(out_pending, rc);
2701
2702         if (mdd_tobj) {
2703                 rc = mdd_la_get(env, mdd_tobj, tattr, BYPASS_CAPA);
2704                 if (rc)
2705                         GOTO(out_pending, rc);
2706         }
2707
2708         rc = mdd_la_get(env, mdd_tpobj, tpattr, BYPASS_CAPA);
2709         if (rc)
2710                 GOTO(out_pending, rc);
2711
2712         rc = mdd_rename_sanity_check(env, mdd_spobj, pattr, mdd_tpobj, tpattr,
2713                                      mdd_sobj, cattr, mdd_tobj, tattr);
2714         if (rc)
2715                 GOTO(out_pending, rc);
2716
2717         rc = mdd_name_check(mdd, ltname);
2718         if (rc < 0)
2719                 GOTO(out_pending, rc);
2720
2721         handle = mdd_trans_create(env, mdd);
2722         if (IS_ERR(handle))
2723                 GOTO(out_pending, rc = PTR_ERR(handle));
2724
2725         memset(ldata, 0, sizeof(*ldata));
2726         mdd_linkea_prepare(env, mdd_sobj, NULL, NULL, mdd_object_fid(mdd_tpobj),
2727                            ltname, 1, 0, ldata);
2728         rc = mdd_declare_rename(env, mdd, mdd_spobj, mdd_tpobj, mdd_sobj,
2729                                 mdd_tobj, lsname, ltname, ma, ldata, handle);
2730         if (rc)
2731                 GOTO(stop, rc);
2732
2733         rc = mdd_trans_start(env, mdd, handle);
2734         if (rc)
2735                 GOTO(stop, rc);
2736
2737         /* FIXME: Should consider tobj and sobj too in rename_lock. */
2738         rc = mdd_rename_order(env, mdd, mdd_spobj, pattr, mdd_tpobj);
2739         if (rc < 0)
2740                 GOTO(cleanup_unlocked, rc);
2741
2742         is_dir = S_ISDIR(cattr->la_mode);
2743
2744         /* Remove source name from source directory */
2745         rc = __mdd_index_delete(env, mdd_spobj, sname, is_dir, handle,
2746                                 mdd_object_capa(env, mdd_spobj));
2747         if (rc)
2748                 GOTO(cleanup, rc);
2749
2750         /* "mv dir1 dir2" needs "dir1/.." link update */
2751         if (is_dir && mdd_sobj && !lu_fid_eq(spobj_fid, tpobj_fid)) {
2752                 rc = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle,
2753                                         mdd_object_capa(env, mdd_sobj));
2754                 if (rc != 0)
2755                         GOTO(fixup_spobj2, rc);
2756
2757                 rc = __mdd_index_insert_only(env, mdd_sobj, tpobj_fid, S_IFDIR,
2758                                              dotdot, handle,
2759                                              mdd_object_capa(env, mdd_sobj));
2760                 if (rc != 0)
2761                         GOTO(fixup_spobj, rc);
2762         }
2763
2764         /* Remove target name from target directory
2765          * Here tobj can be remote one, so we do index_delete unconditionally
2766          * and -ENOENT is allowed.
2767          */
2768         rc = __mdd_index_delete(env, mdd_tpobj, tname, is_dir, handle,
2769                                 mdd_object_capa(env, mdd_tpobj));
2770         if (rc != 0) {
2771                 if (mdd_tobj) {
2772                         /* tname might been renamed to something else */
2773                         GOTO(fixup_spobj, rc);
2774                 }
2775                 if (rc != -ENOENT)
2776                         GOTO(fixup_spobj, rc);
2777         }
2778
2779         /* Insert new fid with target name into target dir */
2780         rc = __mdd_index_insert(env, mdd_tpobj, lf, cattr->la_mode,
2781                                 tname, handle, mdd_object_capa(env, mdd_tpobj));
2782         if (rc != 0)
2783                 GOTO(fixup_tpobj, rc);
2784
2785         LASSERT(ma->ma_attr.la_valid & LA_CTIME);
2786         la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime;
2787
2788         /* XXX: mdd_sobj must be local one if it is NOT NULL. */
2789         if (mdd_sobj) {
2790                 la->la_valid = LA_CTIME;
2791                 rc = mdd_update_time(env, mdd_sobj, cattr, la, handle);
2792                 if (rc)
2793                         GOTO(fixup_tpobj, rc);
2794         }
2795
2796         /* Remove old target object
2797          * For tobj is remote case cmm layer has processed
2798          * and set tobj to NULL then. So when tobj is NOT NULL,
2799          * it must be local one.
2800          */
2801         if (tobj && mdd_object_exists(mdd_tobj)) {
2802                 mdd_write_lock(env, mdd_tobj, MOR_TGT_CHILD);
2803                 tobj_locked = 1;
2804                 if (mdd_is_dead_obj(mdd_tobj)) {
2805                         /* shld not be dead, something is wrong */
2806                         CERROR("tobj is dead, something is wrong\n");
2807                         rc = -EINVAL;
2808                         goto cleanup;
2809                 }
2810                 mdo_ref_del(env, mdd_tobj, handle);
2811
2812                 /* Remove dot reference. */
2813                 if (S_ISDIR(tattr->la_mode))
2814                         mdo_ref_del(env, mdd_tobj, handle);
2815                 tobj_ref = 1;
2816
2817                 /* fetch updated nlink */
2818                 rc = mdd_la_get(env, mdd_tobj, tattr, BYPASS_CAPA);
2819                 if (rc != 0) {
2820                         CERROR("%s: Failed to get nlink for tobj "
2821                                 DFID": rc = %d\n",
2822                                 mdd2obd_dev(mdd)->obd_name,
2823                                 PFID(tpobj_fid), rc);
2824                         GOTO(fixup_tpobj, rc);
2825                 }
2826
2827                 la->la_valid = LA_CTIME;
2828                 rc = mdd_update_time(env, mdd_tobj, tattr, la, handle);
2829                 if (rc != 0) {
2830                         CERROR("%s: Failed to set ctime for tobj "
2831                                 DFID": rc = %d\n",
2832                                 mdd2obd_dev(mdd)->obd_name,
2833                                 PFID(tpobj_fid), rc);
2834                         GOTO(fixup_tpobj, rc);
2835                 }
2836
2837                 /* XXX: this transfer to ma will be removed with LOD/OSP */
2838                 ma->ma_attr = *tattr;
2839                 ma->ma_valid |= MA_INODE;
2840                 rc = mdd_finish_unlink(env, mdd_tobj, ma, mdd_tpobj, ltname,
2841                                        handle);
2842                 if (rc != 0) {
2843                         CERROR("%s: Failed to unlink tobj "
2844                                 DFID": rc = %d\n",
2845                                 mdd2obd_dev(mdd)->obd_name,
2846                                 PFID(tpobj_fid), rc);
2847                         GOTO(fixup_tpobj, rc);
2848                 }
2849
2850                 /* fetch updated nlink */
2851                 rc = mdd_la_get(env, mdd_tobj, tattr, BYPASS_CAPA);
2852                 if (rc != 0) {
2853                         CERROR("%s: Failed to get nlink for tobj "
2854                                 DFID": rc = %d\n",
2855                                 mdd2obd_dev(mdd)->obd_name,
2856                                 PFID(tpobj_fid), rc);
2857                         GOTO(fixup_tpobj, rc);
2858                 }
2859                 /* XXX: this transfer to ma will be removed with LOD/OSP */
2860                 ma->ma_attr = *tattr;
2861                 ma->ma_valid |= MA_INODE;
2862
2863                 if (tattr->la_nlink == 0) {
2864                         cl_flags |= CLF_RENAME_LAST;
2865                         if (mdd_hsm_archive_exists(env, mdd_tobj, ma))
2866                                 cl_flags |= CLF_RENAME_LAST_EXISTS;
2867                 }
2868         }
2869
2870         la->la_valid = LA_CTIME | LA_MTIME;
2871         rc = mdd_update_time(env, mdd_spobj, pattr, la, handle);
2872         if (rc)
2873                 GOTO(fixup_tpobj, rc);
2874
2875         if (mdd_spobj != mdd_tpobj) {
2876                 la->la_valid = LA_CTIME | LA_MTIME;
2877                 rc = mdd_update_time(env, mdd_tpobj, tpattr, la, handle);
2878         }
2879
2880         if (rc == 0 && mdd_sobj) {
2881                 mdd_write_lock(env, mdd_sobj, MOR_SRC_CHILD);
2882                 rc = mdd_links_rename(env, mdd_sobj, mdo2fid(mdd_spobj), lsname,
2883                                       mdo2fid(mdd_tpobj), ltname, handle, NULL,
2884                                       0, 0);
2885                 if (rc == -ENOENT)
2886                         /* Old files might not have EA entry */
2887                         mdd_links_add(env, mdd_sobj, mdo2fid(mdd_spobj),
2888                                       lsname, handle, NULL, 0);
2889                 mdd_write_unlock(env, mdd_sobj);
2890                 /* We don't fail the transaction if the link ea can't be
2891                    updated -- fid2path will use alternate lookup method. */
2892                 rc = 0;
2893         }
2894
2895         EXIT;
2896
2897 fixup_tpobj:
2898         if (rc) {
2899                 rc2 = __mdd_index_delete(env, mdd_tpobj, tname, is_dir, handle,
2900                                          BYPASS_CAPA);
2901                 if (rc2)
2902                         CWARN("tp obj fix error %d\n",rc2);
2903
2904                 if (mdd_tobj && mdd_object_exists(mdd_tobj) &&
2905                     !mdd_is_dead_obj(mdd_tobj)) {
2906                         if (tobj_ref) {
2907                                 mdo_ref_add(env, mdd_tobj, handle);
2908                                 if (is_dir)
2909                                         mdo_ref_add(env, mdd_tobj, handle);
2910                         }
2911
2912                         rc2 = __mdd_index_insert(env, mdd_tpobj,
2913                                                   mdo2fid(mdd_tobj),
2914                                                   mdd_object_type(mdd_tobj),
2915                                                   tname, handle, BYPASS_CAPA);
2916                         if (rc2 != 0)
2917                                 CWARN("tp obj fix error: rc = %d\n", rc2);
2918                 }
2919         }
2920
2921 fixup_spobj:
2922         if (rc && is_dir && mdd_sobj && mdd_spobj != mdd_tpobj) {
2923                 rc2 = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle,
2924                                               BYPASS_CAPA);
2925
2926                 if (rc2)
2927                         CWARN("%s: sp obj dotdot delete error: rc = %d\n",
2928                                mdd2obd_dev(mdd)->obd_name, rc2);
2929
2930
2931                 rc2 = __mdd_index_insert_only(env, mdd_sobj, spobj_fid, S_IFDIR,
2932                                               dotdot, handle, BYPASS_CAPA);
2933                 if (rc2 != 0)
2934                         CWARN("%s: sp obj dotdot insert error: rc = %d\n",
2935                               mdd2obd_dev(mdd)->obd_name, rc2);
2936         }
2937
2938 fixup_spobj2:
2939         if (rc != 0) {
2940                 rc2 = __mdd_index_insert(env, mdd_spobj, lf,
2941                                          mdd_object_type(mdd_sobj), sname,
2942                                          handle, BYPASS_CAPA);
2943                 if (rc2 != 0)
2944                         CWARN("sp obj fix error: rc = %d\n", rc2);
2945         }
2946
2947 cleanup:
2948         if (tobj_locked)
2949                 mdd_write_unlock(env, mdd_tobj);
2950
2951 cleanup_unlocked:
2952         if (rc == 0)
2953                 rc = mdd_changelog_ext_ns_store(env, mdd, CL_RENAME, cl_flags,
2954                                                 mdd_tobj, tpobj_fid, lf,
2955                                                 spobj_fid, ltname, lsname,
2956                                                 handle);
2957
2958 stop:
2959         mdd_trans_stop(env, mdd, rc, handle);
2960
2961 out_pending:
2962         mdd_object_put(env, mdd_sobj);
2963         return rc;
2964 }
2965
2966 /**
2967  * During migration once the parent FID has been changed,
2968  * we need update the parent FID in linkea.
2969  **/
2970 static int mdd_linkea_update_child_internal(const struct lu_env *env,
2971                                             struct mdd_object *parent,
2972                                             struct mdd_object *child,
2973                                             const char *name, int namelen,
2974                                             struct thandle *handle,
2975                                             bool declare)
2976 {
2977         struct mdd_thread_info  *info = mdd_env_info(env);
2978         struct linkea_data      ldata = {0};
2979         struct lu_buf           *buf = &info->mti_link_buf;
2980         int                     count;
2981         int                     rc = 0;
2982
2983         ENTRY;
2984
2985         buf = lu_buf_check_and_alloc(buf, PATH_MAX);
2986         if (buf->lb_buf == NULL)
2987                 RETURN(-ENOMEM);
2988
2989         ldata.ld_buf = buf;
2990         rc = mdd_links_read(env, child, &ldata);
2991         if (rc != 0) {
2992                 if (rc == -ENOENT || rc == -ENODATA)
2993                         rc = 0;
2994                 RETURN(rc);
2995         }
2996
2997         LASSERT(ldata.ld_leh != NULL);
2998         ldata.ld_lee = (struct link_ea_entry *)(ldata.ld_leh + 1);
2999         for (count = 0; count < ldata.ld_leh->leh_reccount; count++) {
3000                 struct mdd_device *mdd = mdo2mdd(&child->mod_obj);
3001                 struct lu_name lname;
3002                 struct lu_fid  fid;
3003
3004                 linkea_entry_unpack(ldata.ld_lee, &ldata.ld_reclen,
3005                                     &lname, &fid);
3006
3007                 if (strncmp(lname.ln_name, name, namelen) != 0 ||
3008                     lu_fid_eq(&fid, mdd_object_fid(parent))) {
3009                         ldata.ld_lee = (struct link_ea_entry *)
3010                                        ((char *)ldata.ld_lee +
3011                                         ldata.ld_reclen);
3012                         continue;
3013                 }
3014
3015                 CDEBUG(D_INFO, "%s: update "DFID" with %.*s:"DFID"\n",
3016                        mdd2obd_dev(mdd)->obd_name, PFID(mdd_object_fid(child)),
3017                        lname.ln_namelen, lname.ln_name,
3018                        PFID(mdd_object_fid(parent)));
3019                 /* update to the new parent fid */
3020                 linkea_entry_pack(ldata.ld_lee, &lname,
3021                                   mdd_object_fid(parent));
3022                 if (declare)
3023                         rc = mdd_declare_links_add(env, child, handle, &ldata);
3024                 else
3025                         rc = mdd_links_write(env, child, &ldata, handle);
3026                 break;
3027         }
3028         RETURN(rc);
3029 }
3030
3031 static int mdd_linkea_declare_update_child(const struct lu_env *env,
3032                                            struct mdd_object *parent,
3033                                            struct mdd_object *child,
3034                                            const char *name, int namelen,
3035                                            struct thandle *handle)
3036 {
3037         return mdd_linkea_update_child_internal(env, parent, child, name,
3038                                                 namelen, handle, true);
3039 }
3040
3041 static int mdd_linkea_update_child(const struct lu_env *env,
3042                                    struct mdd_object *parent,
3043                                    struct mdd_object *child,
3044                                    const char *name, int namelen,
3045                                    struct thandle *handle)
3046 {
3047         return mdd_linkea_update_child_internal(env, parent, child, name,
3048                                                 namelen, handle, false);
3049 }
3050
3051 static int mdd_update_linkea_internal(const struct lu_env *env,
3052                                       struct mdd_object *mdd_pobj,
3053                                       struct mdd_object *mdd_sobj,
3054                                       struct mdd_object *mdd_tobj,
3055                                       const struct lu_name *child_name,
3056                                       struct thandle *handle,
3057                                       int declare)
3058 {
3059         struct mdd_thread_info  *info = mdd_env_info(env);
3060         struct linkea_data      *ldata = &info->mti_link_data;
3061         int                     count;
3062         int                     rc = 0;
3063         ENTRY;
3064
3065         rc = mdd_links_read(env, mdd_sobj, ldata);
3066         if (rc != 0) {
3067                 if (rc == -ENOENT || rc == -ENODATA)
3068                         rc = 0;
3069                 RETURN(rc);
3070         }
3071
3072         if (declare)
3073                 rc = mdd_declare_links_add(env, mdd_tobj, handle, ldata);
3074         else
3075                 rc = mdd_links_write(env, mdd_tobj, ldata, handle);
3076
3077         if (rc != 0)
3078                 RETURN(rc);
3079
3080         /* If it is mulitple links file, we need update the name entry for
3081          * all parent */
3082         LASSERT(ldata->ld_leh != NULL);
3083         ldata->ld_lee = (struct link_ea_entry *)(ldata->ld_leh + 1);
3084         for (count = 0; count < ldata->ld_leh->leh_reccount; count++) {
3085                 struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3086                 struct mdd_object       *pobj;
3087                 struct lu_name          lname;
3088                 struct lu_fid           fid;
3089
3090                 linkea_entry_unpack(ldata->ld_lee, &ldata->ld_reclen,
3091                                     &lname, &fid);
3092                 ldata->ld_lee = (struct link_ea_entry *)((char *)ldata->ld_lee +
3093                                                          ldata->ld_reclen);
3094                 pobj = mdd_object_find(env, mdd, &fid);
3095                 if (IS_ERR(pobj)) {
3096                         CWARN("%s: cannot find obj "DFID": rc = %ld\n",
3097                               mdd2obd_dev(mdd)->obd_name, PFID(&fid),
3098                               PTR_ERR(pobj));
3099                         continue;
3100                 }
3101
3102                 if (!mdd_object_exists(pobj)) {
3103                         CDEBUG(D_INFO, "%s: obj "DFID" does not exist\n",
3104                               mdd2obd_dev(mdd)->obd_name, PFID(&fid));
3105                         GOTO(next_put, rc);
3106                 }
3107
3108                 if (pobj == mdd_pobj &&
3109                     lname.ln_namelen == child_name->ln_namelen &&
3110                     strncmp(lname.ln_name, child_name->ln_name,
3111                             lname.ln_namelen) == 0) {
3112                         CDEBUG(D_INFO, "%s: skip its own %s: "DFID"\n",
3113                               mdd2obd_dev(mdd)->obd_name, child_name->ln_name,
3114                               PFID(&fid));
3115                         GOTO(next_put, rc);
3116                 }
3117
3118                 CDEBUG(D_INFO, "%s: update "DFID" with "DNAME":"DFID"\n",
3119                        mdd2obd_dev(mdd)->obd_name, PFID(mdd_object_fid(pobj)),
3120                        PNAME(&lname), PFID(mdd_object_fid(mdd_tobj)));
3121
3122                 if (declare) {
3123                         /* Remove source name from source directory */
3124                         /* Insert new fid with target name into target dir */
3125                         rc = mdo_declare_index_delete(env, pobj, lname.ln_name,
3126                                                       handle);
3127                         if (rc != 0)
3128                                 GOTO(next_put, rc);
3129
3130                         rc = mdo_declare_index_insert(env, pobj,
3131                                         mdd_object_fid(mdd_tobj),
3132                                         mdd_object_type(mdd_tobj),
3133                                         lname.ln_name, handle);
3134                         if (rc != 0)
3135                                 GOTO(next_put, rc);
3136
3137                         rc = mdo_declare_ref_add(env, mdd_tobj, handle);
3138                         if (rc)
3139                                 GOTO(next_put, rc);
3140
3141                         rc = mdo_declare_ref_del(env, mdd_sobj, handle);
3142                         if (rc)
3143                                 GOTO(next_put, rc);
3144                 } else {
3145                         rc = __mdd_index_delete(env, pobj, lname.ln_name,
3146                                                 0, handle,
3147                                                 mdd_object_capa(env, pobj));
3148                         if (rc)
3149                                 GOTO(next_put, rc);
3150
3151                         rc = __mdd_index_insert(env, pobj,
3152                                         mdd_object_fid(mdd_tobj),
3153                                         mdd_object_type(mdd_tobj),
3154                                         lname.ln_name, handle,
3155                                         mdd_object_capa(env, pobj));
3156                         if (rc != 0)
3157                                 GOTO(next_put, rc);
3158
3159                         mdd_write_lock(env, mdd_tobj, MOR_SRC_CHILD);
3160                         rc = mdo_ref_add(env, mdd_tobj, handle);
3161                         mdd_write_unlock(env, mdd_tobj);
3162                         if (rc)
3163                                 GOTO(next_put, rc);
3164
3165                         mdd_write_lock(env, mdd_sobj, MOR_TGT_CHILD);
3166                         mdo_ref_del(env, mdd_sobj, handle);
3167                         mdd_write_unlock(env, mdd_sobj);
3168                 }
3169 next_put:
3170                 mdd_object_put(env, pobj);
3171                 if (rc != 0)
3172                         break;
3173         }
3174
3175         RETURN(rc);
3176 }
3177
3178 static int mdd_migrate_xattrs(const struct lu_env *env,
3179                               struct mdd_object *mdd_sobj,
3180                               struct mdd_object *mdd_tobj)
3181 {
3182         struct mdd_thread_info  *info = mdd_env_info(env);
3183         struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3184         char                    *xname;
3185         struct thandle          *handle;
3186         struct lu_buf           xbuf;
3187         int                     xlen;
3188         int                     rem;
3189         int                     xsize;
3190         int                     list_xsize;
3191         struct lu_buf           list_xbuf;
3192         int                     rc;
3193
3194         /* retrieve xattr list from the old object */
3195         list_xsize = mdo_xattr_list(env, mdd_sobj, &LU_BUF_NULL,
3196                                     mdd_object_capa(env, mdd_sobj));
3197         if (list_xsize == -ENODATA)
3198                 return 0;
3199
3200         if (list_xsize < 0)
3201                 return list_xsize;
3202
3203         lu_buf_check_and_alloc(&info->mti_big_buf, list_xsize);
3204         if (info->mti_big_buf.lb_buf == NULL)
3205                 return -ENOMEM;
3206
3207         list_xbuf.lb_buf = info->mti_big_buf.lb_buf;
3208         list_xbuf.lb_len = list_xsize;
3209         rc = mdo_xattr_list(env, mdd_sobj, &list_xbuf,
3210                             mdd_object_capa(env, mdd_sobj));
3211         if (rc < 0)
3212                 return rc;
3213         rc = 0;
3214         rem = list_xsize;
3215         xname = list_xbuf.lb_buf;
3216         while (rem > 0) {
3217                 xlen = strnlen(xname, rem - 1) + 1;
3218                 if (strcmp(XATTR_NAME_LINK, xname) == 0 ||
3219                     strcmp(XATTR_NAME_LMA, xname) == 0 ||
3220                     strcmp(XATTR_NAME_LMV, xname) == 0)
3221                         goto next;
3222
3223                 /* For directory, if there are default layout, migrate here */
3224                 if (strcmp(XATTR_NAME_LOV, xname) == 0 &&
3225                     !S_ISDIR(lu_object_attr(&mdd_sobj->mod_obj.mo_lu)))
3226                         goto next;
3227
3228                 xsize = mdo_xattr_get(env, mdd_sobj, &LU_BUF_NULL,
3229                                       xname,
3230                                       mdd_object_capa(env, mdd_sobj));
3231                 if (xsize == -ENODATA)
3232                         goto next;
3233                 if (xsize < 0)
3234                         GOTO(out, rc);
3235
3236                 lu_buf_check_and_alloc(&info->mti_link_buf, xsize);
3237                 if (info->mti_link_buf.lb_buf == NULL)
3238                         GOTO(out, rc = -ENOMEM);
3239
3240                 xbuf.lb_len = xsize;
3241                 xbuf.lb_buf = info->mti_link_buf.lb_buf;
3242                 rc = mdo_xattr_get(env, mdd_sobj, &xbuf, xname,
3243                                    mdd_object_capa(env, mdd_sobj));
3244                 if (rc == -ENODATA)
3245                         goto next;
3246                 if (rc < 0)
3247                         GOTO(out, rc);
3248
3249                 handle = mdd_trans_create(env, mdd);
3250                 if (IS_ERR(handle))
3251                         GOTO(out, rc = PTR_ERR(handle));
3252
3253                 rc = mdo_declare_xattr_set(env, mdd_tobj, &xbuf, xname, 0,
3254                                            handle);
3255                 if (rc != 0)
3256                         GOTO(stop_trans, rc);
3257                 /* Note: this transaction is part of migration, and it is not
3258                  * the last step of migration, so we set th_local = 1 to avoid
3259                  * update last rcvd for this transaction */
3260                 handle->th_local = 1;
3261                 rc = mdd_trans_start(env, mdd, handle);
3262                 if (rc != 0)
3263                         GOTO(stop_trans, rc);
3264
3265                 rc = mdo_xattr_set(env, mdd_tobj, &xbuf, xname, 0, handle,
3266                                    mdd_object_capa(env, mdd_sobj));
3267                 if (rc == -EEXIST)
3268                         GOTO(stop_trans, rc = 0);
3269
3270                 if (rc != 0)
3271                         GOTO(stop_trans, rc);
3272 stop_trans:
3273                 mdd_trans_stop(env, mdd, rc, handle);
3274                 if (rc != 0)
3275                         GOTO(out, rc);
3276 next:
3277                 rem -= xlen;
3278                 memmove(xname, xname + xlen, rem);
3279         }
3280 out:
3281         return rc;
3282 }
3283
3284 static int mdd_declare_migrate_create(const struct lu_env *env,
3285                                       struct mdd_object *mdd_pobj,
3286                                       struct mdd_object *mdd_sobj,
3287                                       struct mdd_object *mdd_tobj,
3288                                       struct md_op_spec *spec,
3289                                       struct lu_attr *la,
3290                                       union lmv_mds_md *mgr_ea,
3291                                       struct thandle *handle)
3292 {
3293         struct lu_attr          *la_flag = MDD_ENV_VAR(env, la_for_fix);
3294         const struct lu_buf     *buf;
3295         int                     rc;
3296         int                     mgr_easize;
3297
3298         rc = mdd_declare_object_create_internal(env, mdd_pobj, mdd_tobj, la,
3299                                                 handle, spec, NULL);
3300         if (rc != 0)
3301                 return rc;
3302
3303         rc = mdd_declare_object_initialize(env, mdd_pobj, mdd_tobj, la,
3304                                            handle);
3305         if (rc != 0)
3306                 return rc;
3307
3308         if (S_ISLNK(la->la_mode)) {
3309                 const char *target_name = spec->u.sp_symname;
3310                 int sym_len = strlen(target_name);
3311                 const struct lu_buf *buf;
3312
3313                 buf = mdd_buf_get_const(env, target_name, sym_len);
3314                 rc = dt_declare_record_write(env, mdd_object_child(mdd_tobj),
3315                                              buf, 0, handle);
3316                 if (rc != 0)
3317                         return rc;
3318         }
3319
3320         if (spec->u.sp_ea.eadata != NULL && spec->u.sp_ea.eadatalen != 0) {
3321                 buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
3322                                         spec->u.sp_ea.eadatalen);
3323                 rc = mdo_declare_xattr_set(env, mdd_tobj, buf, XATTR_NAME_LOV,
3324                                            0, handle);
3325                 if (rc)
3326                         return rc;
3327         }
3328
3329         mgr_easize = lmv_mds_md_size(2, LMV_MAGIC_V1);
3330         buf = mdd_buf_get_const(env, mgr_ea, mgr_easize);
3331         rc = mdo_declare_xattr_set(env, mdd_sobj, buf, XATTR_NAME_LMV,
3332                                    0, handle);
3333         if (rc)
3334                 return rc;
3335
3336         la_flag->la_valid = LA_FLAGS;
3337         la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL;
3338         mdd_flags_xlate(mdd_sobj, la_flag->la_flags);
3339         rc = mdo_declare_attr_set(env, mdd_sobj, la_flag, handle);
3340
3341         return rc;
3342 }
3343
3344 static int mdd_migrate_create(const struct lu_env *env,
3345                               struct mdd_object *mdd_pobj,
3346                               struct mdd_object *mdd_sobj,
3347                               struct mdd_object *mdd_tobj,
3348                               struct lu_attr *la)
3349 {
3350         struct mdd_thread_info  *info = mdd_env_info(env);
3351         struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3352         struct md_op_spec       *spec = &info->mti_spec;
3353         struct lu_buf           lmm_buf = { 0 };
3354         struct lu_buf           link_buf = { 0 };
3355         const struct lu_buf     *buf;
3356         struct thandle          *handle;
3357         struct lmv_mds_md_v1    *mgr_ea;
3358         struct lu_attr          *la_flag = MDD_ENV_VAR(env, la_for_fix);
3359         struct dt_allocation_hint *hint = &mdd_env_info(env)->mti_hint;
3360         int                     mgr_easize;
3361         int                     rc;
3362         ENTRY;
3363
3364         /* prepare spec for create */
3365         memset(spec, 0, sizeof(*spec));
3366         spec->sp_cr_lookup = 0;
3367         spec->sp_feat = &dt_directory_features;
3368         if (S_ISLNK(la->la_mode)) {
3369                 buf = lu_buf_check_and_alloc(
3370                                 &mdd_env_info(env)->mti_big_buf,
3371                                 la->la_size + 1);
3372                 link_buf = *buf;
3373                 link_buf.lb_len = la->la_size + 1;
3374                 rc = mdd_readlink(env, &mdd_sobj->mod_obj, &link_buf);
3375                 if (rc <= 0) {
3376                         rc = rc != 0 ? rc : -EFAULT;
3377                         CERROR("%s: "DFID" readlink failed: rc = %d\n",
3378                                mdd2obd_dev(mdd)->obd_name,
3379                                PFID(mdd_object_fid(mdd_sobj)), rc);
3380                         RETURN(rc);
3381                 }
3382                 spec->u.sp_symname = link_buf.lb_buf;
3383         } else if S_ISREG(la->la_mode) {
3384                 /* retrieve lov of the old object */
3385                 rc = mdd_get_lov_ea(env, mdd_sobj, &lmm_buf);
3386                 if (rc != 0 && rc != -ENODATA)
3387                         RETURN(rc);
3388                 if (lmm_buf.lb_buf != NULL && lmm_buf.lb_len != 0) {
3389                         spec->u.sp_ea.eadata = lmm_buf.lb_buf;
3390                         spec->u.sp_ea.eadatalen = lmm_buf.lb_len;
3391                         spec->sp_cr_flags |= MDS_OPEN_HAS_EA;
3392                 }
3393         }
3394
3395         mgr_ea = (struct lmv_mds_md_v1 *)info->mti_xattr_buf;
3396         memset(mgr_ea, 0, sizeof(mgr_ea));
3397         mgr_ea->lmv_magic = cpu_to_le32(LMV_MAGIC_V1);
3398         mgr_ea->lmv_stripe_count = cpu_to_le32(2);
3399         mgr_ea->lmv_master_mdt_index = mdd_seq_site(mdd)->ss_node_id;
3400         mgr_ea->lmv_hash_type = cpu_to_le32(LMV_HASH_FLAG_MIGRATION);
3401         fid_cpu_to_le(&mgr_ea->lmv_stripe_fids[0], mdd_object_fid(mdd_sobj));
3402         fid_cpu_to_le(&mgr_ea->lmv_stripe_fids[1], mdd_object_fid(mdd_tobj));
3403
3404         mdd_object_make_hint(env, mdd_pobj, mdd_tobj, la, spec, hint);
3405
3406         handle = mdd_trans_create(env, mdd);
3407         if (IS_ERR(handle))
3408                 GOTO(out_free, rc = PTR_ERR(handle));
3409
3410         /* Note: this transaction is part of migration, and it is not
3411          * the last step of migration, so we set th_local = 1 to avoid
3412          * update last rcvd for this transaction */
3413         handle->th_local = 1;
3414         rc = mdd_declare_migrate_create(env, mdd_pobj, mdd_sobj, mdd_tobj,
3415                                         spec, la,
3416                                         (union lmv_mds_md *)info->mti_xattr_buf,
3417                                         handle);
3418         if (rc != 0)
3419                 GOTO(stop_trans, rc);
3420
3421         rc = mdd_trans_start(env, mdd, handle);
3422         if (rc != 0)
3423                 GOTO(stop_trans, rc);
3424
3425         /* create the target object */
3426         rc = mdd_object_create(env, mdd_pobj, mdd_tobj, la, spec, NULL, NULL,
3427                                hint, handle);
3428         if (rc != 0)
3429                 GOTO(stop_trans, rc);
3430
3431         /* Set MIGRATE EA on the source inode, so once the migration needs
3432          * to be re-done during failover, the re-do process can locate the
3433          * target object which is already being created. */
3434         mgr_easize = lmv_mds_md_size(2, LMV_MAGIC_V1);
3435         buf = mdd_buf_get_const(env, mgr_ea, mgr_easize);
3436         rc = mdo_xattr_set(env, mdd_sobj, buf, XATTR_NAME_LMV, 0,
3437                            handle, mdd_object_capa(env, mdd_sobj));
3438         if (rc != 0)
3439                 GOTO(stop_trans, rc);
3440
3441         /* Set immutable flag, so any modification is disabled until
3442          * the migration is done. Once the migration is interrupted,
3443          * if the resume process find the migrating object has both
3444          * IMMUTALBE flag and MIGRATE EA, it need to clear IMMUTABLE
3445          * flag and approve the migration */
3446         la_flag->la_valid = LA_FLAGS;
3447         la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL;
3448         mdd_flags_xlate(mdd_sobj, la_flag->la_flags);
3449         rc = mdo_attr_set(env, mdd_sobj, la_flag, handle,
3450                           mdd_object_capa(env, mdd_sobj));
3451 stop_trans:
3452         if (handle != NULL)
3453                 mdd_trans_stop(env, mdd, rc, handle);
3454 out_free:
3455         if (lmm_buf.lb_buf != NULL)
3456                 OBD_FREE(lmm_buf.lb_buf, lmm_buf.lb_len);
3457         RETURN(rc);
3458 }
3459
3460 static int mdd_migrate_entries(const struct lu_env *env,
3461                                struct mdd_object *mdd_sobj,
3462                                struct mdd_object *mdd_tobj)
3463 {
3464         struct dt_object        *next = mdd_object_child(mdd_sobj);
3465         struct mdd_device       *mdd = mdo2mdd(&mdd_sobj->mod_obj);
3466         struct dt_object        *dt_tobj = mdd_object_child(mdd_tobj);
3467         struct thandle          *handle;
3468         struct dt_it            *it;
3469         const struct dt_it_ops  *iops;
3470         int                      rc;
3471         int                      result;
3472         struct lu_dirent        *ent;
3473         ENTRY;
3474
3475         OBD_ALLOC(ent, NAME_MAX + sizeof(*ent) + 1);
3476         if (ent == NULL)
3477                 RETURN(-ENOMEM);
3478
3479         if (!dt_try_as_dir(env, next))
3480                 GOTO(out_ent, rc = -ENOTDIR);
3481         /*
3482          * iterate directories
3483          */
3484         iops = &next->do_index_ops->dio_it;
3485         it = iops->init(env, next, LUDA_FID | LUDA_TYPE,
3486                         mdd_object_capa(env, mdd_sobj));
3487         if (IS_ERR(it))
3488                 GOTO(out_ent, rc = PTR_ERR(it));
3489
3490         rc = iops->load(env, it, 0);
3491         if (rc == 0)
3492                 rc = iops->next(env, it);
3493         else if (rc > 0)
3494                 rc = 0;
3495         /*
3496          * At this point and across for-loop:
3497          *
3498          *  rc == 0 -> ok, proceed.
3499          *  rc >  0 -> end of directory.
3500          *  rc <  0 -> error.
3501          */
3502         do {
3503                 struct mdd_object       *child;
3504                 char                    *name = mdd_env_info(env)->mti_key;
3505                 int                     len;
3506                 int                     recsize;
3507                 int                     is_dir;
3508                 bool                    target_exist = false;
3509
3510                 len = iops->key_size(env, it);
3511                 if (len == 0)
3512                         goto next;
3513
3514                 result = iops->rec(env, it, (struct dt_rec *)ent,
3515                                    LUDA_FID | LUDA_TYPE);
3516                 if (result == -ESTALE)
3517                         goto next;
3518                 if (result != 0) {
3519                         rc = result;
3520                         goto out;
3521                 }
3522
3523                 fid_le_to_cpu(&ent->lde_fid, &ent->lde_fid);
3524                 recsize = le16_to_cpu(ent->lde_reclen);
3525
3526                 /* Insert new fid with target name into target dir */
3527                 if ((ent->lde_namelen == 1 && ent->lde_name[0] == '.') ||
3528                     (ent->lde_namelen == 2 && ent->lde_name[0] == '.' &&
3529                      ent->lde_name[1] == '.'))
3530                         goto next;
3531
3532                 child = mdd_object_find(env, mdd, &ent->lde_fid);
3533                 if (IS_ERR(child))
3534                         GOTO(out, rc = PTR_ERR(child));
3535
3536                 is_dir = S_ISDIR(mdd_object_type(child));
3537
3538                 snprintf(name, ent->lde_namelen + 1, "%s", ent->lde_name);
3539
3540                 /* Check whether the name has been inserted to the target */
3541                 if (dt_try_as_dir(env, dt_tobj)) {
3542                         struct lu_fid *fid = &mdd_env_info(env)->mti_fid2;
3543
3544                         rc = dt_tobj->do_index_ops->dio_lookup(env, dt_tobj,
3545                                                          (struct dt_rec *)fid,
3546                                                          (struct dt_key *)name,
3547                                                 mdd_object_capa(env, mdd_tobj));
3548                         if (unlikely(rc == 0))
3549                                 target_exist = true;
3550                 }
3551
3552                 handle = mdd_trans_create(env, mdd);
3553                 if (IS_ERR(handle))
3554                         GOTO(out, rc = PTR_ERR(handle));
3555
3556                 /* Note: this transaction is part of migration, and it is not
3557                  * the last step of migration, so we set th_local = 1 to avoid
3558                  * updating last rcvd for this transaction */
3559                 handle->th_local = 1;
3560                 if (likely(!target_exist)) {
3561                         rc = mdo_declare_index_insert(env, mdd_tobj,
3562                                                       &ent->lde_fid,
3563                                                       mdd_object_type(child),
3564                                                       name, handle);
3565                         if (rc != 0)
3566                                 GOTO(out_put, rc);
3567
3568                         if (is_dir) {
3569                                 rc = mdo_declare_ref_add(env, mdd_tobj, handle);
3570                                 if (rc != 0)
3571                                         GOTO(out_put, rc);
3572                         }
3573                 }
3574
3575                 rc = mdo_declare_index_delete(env, mdd_sobj, name, handle);
3576                 if (rc != 0)
3577                         GOTO(out_put, rc);
3578
3579                 if (is_dir) {
3580                         rc = mdo_declare_ref_del(env, mdd_sobj, handle);
3581                         if (rc != 0)
3582                                 GOTO(out_put, rc);
3583
3584                         /* Update .. for child */
3585                         rc = mdo_declare_index_delete(env, child, dotdot,
3586                                                       handle);
3587                         if (rc != 0)
3588                                 GOTO(out_put, rc);
3589
3590                         rc = mdo_declare_index_insert(env, child,
3591                                                       mdd_object_fid(mdd_tobj),
3592                                                       S_IFDIR, dotdot, handle);
3593                         if (rc != 0)
3594                                 GOTO(out_put, rc);
3595                 }
3596
3597                 rc = mdd_linkea_declare_update_child(env, mdd_tobj,
3598                                                      child, name,
3599                                                      strlen(name),
3600                                                      handle);
3601                 if (rc != 0)
3602                         GOTO(out_put, rc);
3603
3604                 rc = mdd_trans_start(env, mdd, handle);
3605                 if (rc != 0) {
3606                         CERROR("%s: transaction start failed: rc = %d\n",
3607                                mdd2obd_dev(mdd)->obd_name, rc);
3608                         GOTO(out_put, rc);
3609                 }
3610
3611                 if (likely(!target_exist)) {
3612                         rc = __mdd_index_insert(env, mdd_tobj, &ent->lde_fid,
3613                                                 mdd_object_type(child),
3614                                                 name, handle,
3615                                                 mdd_object_capa(env, mdd_tobj));
3616                         if (rc != 0)
3617                                 GOTO(out_put, rc);
3618
3619                         if (is_dir) {