Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LU-3474 mdd: mdd_links_read() to return linkea_init() errors
[fs/lustre-release.git]
/
lustre
/
mdd
/
mdd_dir.c
diff --git
a/lustre/mdd/mdd_dir.c
b/lustre/mdd/mdd_dir.c
index
e8b2f6d
..
6ac8aed
100644
(file)
--- a/
lustre/mdd/mdd_dir.c
+++ b/
lustre/mdd/mdd_dir.c
@@
-876,6
+876,9
@@
static int __mdd_links_add(const struct lu_env *env,
linkea_add_buf(ldata, lname, tfid);
}
linkea_add_buf(ldata, lname, tfid);
}
+ if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LINKEA_MORE2))
+ linkea_add_buf(ldata, lname, pfid);
+
return linkea_add_buf(ldata, lname, pfid);
}
return linkea_add_buf(ldata, lname, pfid);
}
@@
-919,14
+922,17
@@
static int mdd_linkea_prepare(const struct lu_env *env,
LASSERT(oldpfid != NULL || newpfid != NULL);
LASSERT(oldpfid != NULL || newpfid != NULL);
- if (mdd_obj->mod_flags & DEAD_OBJ)
+ if (mdd_obj->mod_flags & DEAD_OBJ) {
+ /* Prevent linkea to be updated which is NOT necessary. */
+ ldata->ld_reclen = 0;
/* No more links, don't bother */
RETURN(0);
/* No more links, don't bother */
RETURN(0);
+ }
if (oldpfid != NULL) {
rc = __mdd_links_del(env, mdd_obj, ldata, oldlname, oldpfid);
if (rc) {
if (oldpfid != NULL) {
rc = __mdd_links_del(env, mdd_obj, ldata, oldlname, oldpfid);
if (rc) {
- if ((check ==
0
) ||
+ if ((check ==
1
) ||
(rc != -ENODATA && rc != -ENOENT))
RETURN(rc);
/* No changes done. */
(rc != -ENODATA && rc != -ENOENT))
RETURN(rc);
/* No changes done. */
@@
-940,8
+946,6
@@
static int mdd_linkea_prepare(const struct lu_env *env,
* old link */
rc2 = __mdd_links_add(env, mdd_obj, ldata, newlname, newpfid,
first, check);
* old link */
rc2 = __mdd_links_add(env, mdd_obj, ldata, newlname, newpfid,
first, check);
- if (rc2 == -EEXIST)
- rc2 = 0;
}
rc = rc != 0 ? rc : rc2;
}
rc = rc != 0 ? rc : rc2;
@@
-973,7
+977,7
@@
int mdd_links_rename(const struct lu_env *env,
GOTO(out, rc);
}
GOTO(out, rc);
}
- if (ldata->ld_
lee != NULL
)
+ if (ldata->ld_
reclen != 0
)
rc = mdd_links_write(env, mdd_obj, ldata, handle);
EXIT;
out:
rc = mdd_links_write(env, mdd_obj, ldata, handle);
EXIT;
out:
@@
-981,7
+985,7
@@
out:
rc = rc2;
if (rc) {
int error = 1;
rc = rc2;
if (rc) {
int error = 1;
- if (rc == -EOVERFLOW || rc == -ENO
ENT || rc == -ENO
SPC)
+ if (rc == -EOVERFLOW || rc == -ENOSPC)
error = 0;
if (oldpfid == NULL)
CDEBUG(error ? D_ERROR : D_OTHER,
error = 0;
if (oldpfid == NULL)
CDEBUG(error ? D_ERROR : D_OTHER,
@@
-1044,7
+1048,7
@@
int mdd_links_read(const struct lu_env *env, struct mdd_object *mdd_obj,
/* First try a small buf */
LASSERT(env != NULL);
ldata->ld_buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_link_buf,
/* First try a small buf */
LASSERT(env != NULL);
ldata->ld_buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_link_buf,
-
CFS_PAG
E_SIZE);
+
PAGE_CACH
E_SIZE);
if (ldata->ld_buf->lb_buf == NULL)
return -ENOMEM;
if (ldata->ld_buf->lb_buf == NULL)
return -ENOMEM;
@@
-1069,8
+1073,7
@@
int mdd_links_read(const struct lu_env *env, struct mdd_object *mdd_obj,
if (rc < 0)
return rc;
if (rc < 0)
return rc;
- linkea_init(ldata);
- return 0;
+ return linkea_init(ldata);
}
/** Read the link EA into a temp buffer.
}
/** Read the link EA into a temp buffer.
@@
-1108,7
+1111,7
@@
int mdd_declare_links_add(const struct lu_env *env, struct mdd_object *mdd_obj,
ea_len = ldata->ld_leh->leh_len;
linkea = ldata->ld_buf->lb_buf;
} else {
ea_len = ldata->ld_leh->leh_len;
linkea = ldata->ld_buf->lb_buf;
} else {
- ea_len =
4096
;
+ ea_len =
DEFAULT_LINKEA_SIZE
;
linkea = NULL;
}
linkea = NULL;
}
@@
-1287,8
+1290,9
@@
int mdd_finish_unlink(const struct lu_env *env,
LASSERT(mdd_write_locked(env, obj) != 0);
LASSERT(mdd_write_locked(env, obj) != 0);
- if (
rc == 0 && (ma->ma_attr.la_nlink == 0 || is_dir)
) {
+ if (
ma->ma_attr.la_nlink == 0 || is_dir
) {
obj->mod_flags |= DEAD_OBJ;
obj->mod_flags |= DEAD_OBJ;
+
/* add new orphan and the object
* will be deleted during mdd_close() */
if (obj->mod_count) {
/* add new orphan and the object
* will be deleted during mdd_close() */
if (obj->mod_count) {