int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, __u64 start, __u64 end, struct lu_attr *la, struct filter_fid *ff, struct obdo *oa) { struct ofd_thread_info *info = ofd_info(env); struct ofd_device *ofd = ofd_obj2dev(fo); struct ofd_mod_data *fmd; struct dt_object *dob = ofd_object_child(fo); struct thandle *th; int ff_needed = 0; int rc; ENTRY; /* we support truncate, not punch yet */ LASSERT(end == OBD_OBJECT_EOF); fmd = ofd_fmd_get(info->fti_exp, &fo->ofo_header.loh_fid); if (fmd && fmd->fmd_mactime_xid < info->fti_xid) fmd->fmd_mactime_xid = info->fti_xid; ofd_fmd_put(info->fti_exp, fmd); ofd_write_lock(env, fo); if (!ofd_object_exists(fo)) GOTO(unlock, rc = -ENOENT); if (ofd->ofd_lfsck_verify_pfid && oa->o_valid & OBD_MD_FLFID) { rc = ofd_verify_ff(env, fo, oa); if (rc != 0) GOTO(unlock, rc); } /* VBR: version recovery check */ rc = ofd_version_get_check(info, fo); if (rc) GOTO(unlock, rc); rc = ofd_attr_handle_ugid(env, fo, la, 0 /* !is_setattr */); if (rc != 0) GOTO(unlock, rc); if (ff != NULL) { rc = ofd_object_ff_load(env, fo); if (rc == -ENODATA) ff_needed = 1; else if (rc < 0) GOTO(unlock, rc); } th = ofd_trans_create(env, ofd); if (IS_ERR(th)) GOTO(unlock, rc = PTR_ERR(th)); rc = dt_declare_attr_set(env, dob, la, th); if (rc) GOTO(stop, rc); rc = dt_declare_punch(env, dob, start, OBD_OBJECT_EOF, th); if (rc) GOTO(stop, rc); if (ff_needed) { info->fti_buf.lb_buf = ff; info->fti_buf.lb_len = sizeof(*ff); rc = dt_declare_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th); if (rc) GOTO(stop, rc); } rc = ofd_trans_start(env, ofd, fo, th); if (rc) GOTO(stop, rc); rc = dt_punch(env, dob, start, OBD_OBJECT_EOF, th, ofd_object_capa(env, fo)); if (rc) GOTO(stop, rc); rc = dt_attr_set(env, dob, la, th, ofd_object_capa(env, fo)); if (rc) GOTO(stop, rc); if (ff_needed) { rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th, BYPASS_CAPA); if (rc == 0) { fo->ofo_pfid.f_seq = le64_to_cpu(ff->ff_parent.f_seq); fo->ofo_pfid.f_oid = le32_to_cpu(ff->ff_parent.f_oid); /* Currently, the filter_fid::ff_parent::f_ver is not * the real parent MDT-object's FID::f_ver, instead it * is the OST-object index in its parent MDT-object's * layout EA. */ fo->ofo_pfid.f_stripe_idx = le32_to_cpu(ff->ff_parent.f_stripe_idx); } } GOTO(stop, rc); stop: ofd_trans_stop(env, ofd, th, rc); unlock: ofd_write_unlock(env, fo); return rc; }
int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, __u64 start, __u64 end, struct lu_attr *la, struct filter_fid *ff) { struct ofd_thread_info *info = ofd_info(env); struct ofd_device *ofd = ofd_obj2dev(fo); struct ofd_mod_data *fmd; struct dt_object *dob = ofd_object_child(fo); struct thandle *th; int ff_needed = 0; int rc; ENTRY; /* we support truncate, not punch yet */ LASSERT(end == OBD_OBJECT_EOF); fmd = ofd_fmd_get(info->fti_exp, &fo->ofo_header.loh_fid); if (fmd && fmd->fmd_mactime_xid < info->fti_xid) fmd->fmd_mactime_xid = info->fti_xid; ofd_fmd_put(info->fti_exp, fmd); ofd_write_lock(env, fo); if (!ofd_object_exists(fo)) GOTO(unlock, rc = -ENOENT); /* VBR: version recovery check */ rc = ofd_version_get_check(info, fo); if (rc) GOTO(unlock, rc); rc = ofd_attr_handle_ugid(env, fo, la, 0 /* !is_setattr */); if (rc != 0) GOTO(unlock, rc); if (ff != NULL) { rc = ofd_object_ff_check(env, fo); if (rc == -ENODATA) ff_needed = 1; else if (rc < 0) GOTO(unlock, rc); } th = ofd_trans_create(env, ofd); if (IS_ERR(th)) GOTO(unlock, rc = PTR_ERR(th)); rc = dt_declare_attr_set(env, dob, la, th); if (rc) GOTO(stop, rc); rc = dt_declare_punch(env, dob, start, OBD_OBJECT_EOF, th); if (rc) GOTO(stop, rc); if (ff_needed) { info->fti_buf.lb_buf = ff; info->fti_buf.lb_len = sizeof(*ff); rc = dt_declare_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th); if (rc) GOTO(stop, rc); } rc = ofd_trans_start(env, ofd, fo, th); if (rc) GOTO(stop, rc); rc = dt_punch(env, dob, start, OBD_OBJECT_EOF, th, ofd_object_capa(env, fo)); if (rc) GOTO(stop, rc); rc = dt_attr_set(env, dob, la, th, ofd_object_capa(env, fo)); if (rc) GOTO(stop, rc); if (ff_needed) rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th, BYPASS_CAPA); stop: ofd_trans_stop(env, ofd, th, rc); unlock: ofd_write_unlock(env, fo); RETURN(rc); }
int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, struct lu_attr *la, struct filter_fid *ff) { struct ofd_thread_info *info = ofd_info(env); struct ofd_device *ofd = ofd_obj2dev(fo); struct thandle *th; struct ofd_mod_data *fmd; int ff_needed = 0; int rc; ENTRY; ofd_write_lock(env, fo); if (!ofd_object_exists(fo)) GOTO(unlock, rc = -ENOENT); if (la->la_valid & (LA_ATIME | LA_MTIME | LA_CTIME)) { fmd = ofd_fmd_get(info->fti_exp, &fo->ofo_header.loh_fid); if (fmd && fmd->fmd_mactime_xid < info->fti_xid) fmd->fmd_mactime_xid = info->fti_xid; ofd_fmd_put(info->fti_exp, fmd); } /* VBR: version recovery check */ rc = ofd_version_get_check(info, fo); if (rc) GOTO(unlock, rc); rc = ofd_attr_handle_ugid(env, fo, la, 1 /* is_setattr */); if (rc != 0) GOTO(unlock, rc); if (ff != NULL) { rc = ofd_object_ff_load(env, fo); if (rc == -ENODATA) ff_needed = 1; else if (rc < 0) GOTO(unlock, rc); } th = ofd_trans_create(env, ofd); if (IS_ERR(th)) GOTO(unlock, rc = PTR_ERR(th)); rc = dt_declare_attr_set(env, ofd_object_child(fo), la, th); if (rc) GOTO(stop, rc); if (ff_needed) { info->fti_buf.lb_buf = ff; info->fti_buf.lb_len = sizeof(*ff); rc = dt_declare_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th); if (rc) GOTO(stop, rc); } rc = ofd_trans_start(env, ofd, la->la_valid & LA_SIZE ? fo : NULL, th); if (rc) GOTO(stop, rc); rc = dt_attr_set(env, ofd_object_child(fo), la, th, ofd_object_capa(env, fo)); if (rc) GOTO(stop, rc); if (ff_needed) { rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th, BYPASS_CAPA); if (rc == 0) { fo->ofo_pfid.f_seq = le64_to_cpu(ff->ff_parent.f_seq); fo->ofo_pfid.f_oid = le32_to_cpu(ff->ff_parent.f_oid); /* Currently, the filter_fid::ff_parent::f_ver is not * the real parent MDT-object's FID::f_ver, instead it * is the OST-object index in its parent MDT-object's * layout EA. */ fo->ofo_pfid.f_stripe_idx = le32_to_cpu(ff->ff_parent.f_stripe_idx); } } GOTO(stop, rc); stop: ofd_trans_stop(env, ofd, th, rc); unlock: ofd_write_unlock(env, fo); return rc; }
int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, struct lu_attr *la, struct filter_fid *ff) { struct ofd_thread_info *info = ofd_info(env); struct ofd_device *ofd = ofd_obj2dev(fo); struct thandle *th; struct ofd_mod_data *fmd; int ff_needed = 0; int rc; ENTRY; ofd_write_lock(env, fo); if (!ofd_object_exists(fo)) GOTO(unlock, rc = -ENOENT); if (la->la_valid & (LA_ATIME | LA_MTIME | LA_CTIME)) { fmd = ofd_fmd_get(info->fti_exp, &fo->ofo_header.loh_fid); if (fmd && fmd->fmd_mactime_xid < info->fti_xid) fmd->fmd_mactime_xid = info->fti_xid; ofd_fmd_put(info->fti_exp, fmd); } /* VBR: version recovery check */ rc = ofd_version_get_check(info, fo); if (rc) GOTO(unlock, rc); rc = ofd_attr_handle_ugid(env, fo, la, 1 /* is_setattr */); if (rc != 0) GOTO(unlock, rc); if (ff != NULL) { rc = ofd_object_ff_check(env, fo); if (rc == -ENODATA) ff_needed = 1; else if (rc < 0) GOTO(unlock, rc); } th = ofd_trans_create(env, ofd); if (IS_ERR(th)) GOTO(unlock, rc = PTR_ERR(th)); rc = dt_declare_attr_set(env, ofd_object_child(fo), la, th); if (rc) GOTO(stop, rc); if (ff_needed) { info->fti_buf.lb_buf = ff; info->fti_buf.lb_len = sizeof(*ff); rc = dt_declare_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th); if (rc) GOTO(stop, rc); } rc = ofd_trans_start(env, ofd, la->la_valid & LA_SIZE ? fo : NULL, th); if (rc) GOTO(stop, rc); rc = dt_attr_set(env, ofd_object_child(fo), la, th, ofd_object_capa(env, fo)); if (rc) GOTO(stop, rc); if (ff_needed) rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th, BYPASS_CAPA); stop: ofd_trans_stop(env, ofd, th, rc); unlock: ofd_write_unlock(env, fo); RETURN(rc); }