Serialize FMD check and set in OFD to prevent update
with old data.
Update also sanity tests 39j,k to cancel LRU locks on
both mdc and osc namespaces because for DOM files both
MDT and OST stripes are being used
Test-Parameters: testlist=sanity-dom
Signed-off-by: Alexey Zhuravlev <bzzz@whamcloud.com>
Change-Id: I02e28e1e3e8e533d9c7450d798fceb9261b27ea0
Reviewed-on: https://review.whamcloud.com/36228
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Mike Pershin <mpershin@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
int niocount, struct niobuf_local *lnb,
unsigned long granted, int old_rc)
{
int niocount, struct niobuf_local *lnb,
unsigned long granted, int old_rc)
{
+ struct ofd_thread_info *info = ofd_info(env);
struct filter_export_data *fed = &exp->exp_filter_data;
struct ofd_object *fo;
struct dt_object *o;
struct filter_export_data *fed = &exp->exp_filter_data;
struct ofd_object *fo;
struct dt_object *o;
+ /* Don't update timestamps if this write is older than a
+ * setattr which modifies the timestamps. b=10150 */
+ if (la->la_valid && tgt_fmd_check(exp, fid, info->fti_xid)) {
rc = dt_attr_set(env, o, la, th);
if (rc)
GOTO(out_unlock, rc);
rc = dt_attr_set(env, o, la, th);
if (rc)
GOTO(out_unlock, rc);
if (cmd == OBD_BRW_WRITE) {
struct lu_nodemap *nodemap;
if (cmd == OBD_BRW_WRITE) {
struct lu_nodemap *nodemap;
- /* Don't update timestamps if this write is older than a
- * setattr which modifies the timestamps. b=10150 */
- valid = OBD_MD_FLUID | OBD_MD_FLGID | OBD_MD_FLPROJID;
- if (tgt_fmd_check(exp, fid, info->fti_xid))
- valid |= OBD_MD_FLATIME | OBD_MD_FLMTIME |
- OBD_MD_FLCTIME;
-
+ valid = OBD_MD_FLUID | OBD_MD_FLGID | OBD_MD_FLPROJID |
+ OBD_MD_FLATIME | OBD_MD_FLMTIME | OBD_MD_FLCTIME;
la_from_obdo(&info->fti_attr, oa, valid);
rc = ofd_commitrw_write(env, exp, ofd, fid, &info->fti_attr,
la_from_obdo(&info->fti_attr, oa, valid);
rc = ofd_commitrw_write(env, exp, ofd, fid, &info->fti_attr,
if (!ofd_object_exists(fo))
GOTO(out, rc = -ENOENT);
if (!ofd_object_exists(fo))
GOTO(out, rc = -ENOENT);
- if (la->la_valid & (LA_ATIME | LA_MTIME | LA_CTIME))
- tgt_fmd_update(info->fti_exp, &fo->ofo_header.loh_fid,
- info->fti_xid);
-
/* VBR: version recovery check */
rc = ofd_version_get_check(info, fo);
if (rc)
/* VBR: version recovery check */
rc = ofd_version_get_check(info, fo);
if (rc)
if (!ofd_object_exists(fo))
GOTO(unlock, rc = -ENOENT);
if (!ofd_object_exists(fo))
GOTO(unlock, rc = -ENOENT);
+ /* serialize vs ofd_commitrw_write() */
+ if (la->la_valid & (LA_ATIME | LA_MTIME | LA_CTIME))
+ tgt_fmd_update(info->fti_exp, &fo->ofo_header.loh_fid,
+ info->fti_xid);
+
rc = dt_attr_set(env, ofd_object_child(fo), la, th);
if (rc)
GOTO(unlock, rc);
rc = dt_attr_set(env, ofd_object_child(fo), la, th);
if (rc)
GOTO(unlock, rc);
error "mtime is lost on close: $mtime2, " \
"should be $mtime1"
error "mtime is lost on close: $mtime2, " \
"should be $mtime1"
if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
done
lctl set_param fail_loc=0
if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
done
lctl set_param fail_loc=0
[ "$mtime2" = $TEST_39_MTIME ] || \
error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
[ "$mtime2" = $TEST_39_MTIME ] || \
error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME"
if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
done
}
if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
done
}