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