- move handling the dying object in mdt_handle_last_unlink().
extern const struct req_format RQF_MDS_SETXATTR;
extern const struct req_format RQF_MDS_GETATTR;
extern const struct req_format RQF_MDS_CLOSE;
+extern const struct req_format RQF_MDS_CLOSE_LAST;
extern const struct req_format RQF_MDS_CONNECT;
extern const struct req_format RQF_MDS_DISCONNECT;
+extern const struct req_format RQF_MDS_READPAGE;
/*
* This is format of direct (non-intent) MDS_GETATTR_NAME request.
extern const struct req_format RQF_MDS_REINT_CREATE;
extern const struct req_format RQF_MDS_REINT_OPEN;
extern const struct req_format RQF_MDS_REINT_UNLINK;
+extern const struct req_format RQF_MDS_REINT_UNLINK_LAST;
extern const struct req_format RQF_MDS_REINT_LINK;
extern const struct req_format RQF_MDS_REINT_RENAME;
+extern const struct req_format RQF_MDS_REINT_RENAME_LAST;
extern const struct req_format RQF_MDS_REINT_SETATTR;
extern const struct req_format RQF_LDLM_ENQUEUE;
extern const struct req_format RQF_LDLM_INTENT;
#include "mdt_internal.h"
+/* if object is dying, pack the lov/llog data */
+int mdt_handle_last_unlink(struct mdt_thread_info *info,
+ struct mdt_object *mo, const struct req_format *fmt)
+{
+ int rc = 0;
+ ENTRY;
+ /* only for reg files and if that object will be deleted */
+ if (lu_object_is_dying(&mo->mot_header)) {
+ rc = mo_attr_get(info->mti_ctxt, mdt_object_child(mo),
+ &info->mti_attr);
+ if (rc == 0 && S_ISREG(info->mti_attr.la_mode)) {
+ struct mdt_body *body;
+ struct lov_mds_md *lmm;
+
+ /* reply should contains more data,
+ * so we need to extend it */
+ req_capsule_extend(&info->mti_pill, fmt);
+
+ body = req_capsule_server_get(&info->mti_pill,
+ &RMF_MDT_BODY);
+ lmm = req_capsule_server_get(&info->mti_pill,
+ &RMF_MDT_MD);
+
+ mdt_pack_attr2body(body, &info->mti_attr,
+ mdt_object_fid(mo));
+
+/*TODO: lmm data & llog cookie
+ rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(o),
+ lmm, info->mti_mdt->mdt_max_mdsize,
+ XATTR_NAME_LOV);
+ if (rc >= 0) {
+ if (S_ISDIR(info->mti_attr.la_mode))
+ body->valid |= OBD_MD_FLDIREA;
+ else
+ body->valid |= OBD_MD_FLEASIZE;
+ body->eadatasize = rc;
+ rc = 0;
+ }
+*/
+ }
+ }
+ RETURN(rc);
+}
+
/* unpacking */
static int mdt_setattr_unpack(struct mdt_thread_info *info)
int mdt_close(struct mdt_thread_info *info)
{
struct mdt_export_data *med;
- struct mdt_body *repbody;
struct mdt_file_data *mfd;
- struct mdt_object *o;
- struct lov_mds_md *lmm;
int rc;
ENTRY;
/* mdt_handle2mfd increase reference count, we must drop it here */
mdt_mfd_put(mfd);
- o = mfd->mfd_object;
- if (lu_object_is_dying(&o->mot_header)) {
- repbody = req_capsule_server_get(&info->mti_pill,
- &RMF_MDT_BODY);
- lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
-
- rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o),
- &info->mti_attr);
- if (rc == 0) {
- mdt_pack_attr2body(repbody, &info->mti_attr,
- mdt_object_fid(o));
-/*
- rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(o),
- lmm, info->mti_mdt->mdt_max_mdsize,
- XATTR_NAME_LOV);
- if (rc >= 0) {
- if (S_ISDIR(info->mti_attr.la_mode))
- repbody->valid |= OBD_MD_FLDIREA;
- else
- repbody->valid |= OBD_MD_FLEASIZE;
- repbody->eadatasize = rc;
- rc = 0;
- }
-*/
- }
- }
+ rc = mdt_handle_last_unlink(info, mfd->mfd_object,
+ &RQF_MDS_CLOSE_LAST);
+
rc = mdt_mfd_close(info->mti_ctxt, mfd, 1);
RETURN(rc);
/* cmm will take care if child is local or remote */
rc = mdo_unlink(info->mti_ctxt, mdt_object_child(mp),
mdt_object_child(mc), rr->rr_name);
+
+ if (rc)
+ GOTO(out_unlock_child, rc);
+
+ rc = mdt_handle_last_unlink(info, mc, &RQF_MDS_REINT_UNLINK_LAST);
- GOTO(out_unlock_child, rc);
out_unlock_child:
mdt_object_unlock_put(info, mc, lhc);
out_unlock_parent:
&RMF_SYMTGT
};
-static const struct req_msg_field *mds_reint_rename_or_unlink_server[] = {
+static const struct req_msg_field *mds_last_unlink_server[] = {
&RMF_MDT_BODY,
&RMF_MDT_MD,
&RMF_LOGCOOKIES
#endif
};
-static const struct req_msg_field *mds_close_server[] = {
- &RMF_MDT_BODY,
- &RMF_MDT_MD,
- &RMF_LOGCOOKIES
-};
-
static const struct req_format *req_formats[] = {
&RQF_MDS_CONNECT,
&RQF_MDS_DISCONNECT,
&RQF_MDS_GETXATTR,
&RQF_MDS_SETXATTR,
&RQF_MDS_SYNC,
- &RQF_MDS_CLOSE
+ &RQF_MDS_CLOSE,
+ &RQF_MDS_READPAGE,
+ &RQF_MDS_REINT_UNLINK_LAST,
+ &RQF_MDS_CLOSE_LAST,
+ &RQF_MDS_REINT_RENAME_LAST
+
};
struct req_msg_field {
const struct req_format RQF_MDS_REINT_UNLINK =
DEFINE_REQ_FMT0("MDS_REINT_UNLINK", mds_reint_unlink_client,
- mds_reint_rename_or_unlink_server);
+ mdt_body_only);
EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK);
const struct req_format RQF_MDS_REINT_LINK =
const struct req_format RQF_MDS_REINT_RENAME =
DEFINE_REQ_FMT0("MDS_REINT_RENAME", mds_reint_rename_client,
- mds_reint_rename_or_unlink_server);
+ mdt_body_only);
EXPORT_SYMBOL(RQF_MDS_REINT_RENAME);
const struct req_format RQF_MDS_REINT_SETATTR =
const struct req_format RQF_MDS_CLOSE =
DEFINE_REQ_FMT0("MDS_CLOSE",
- mdt_body_only, mds_close_server);
+ mdt_body_only, mdt_body_only);
EXPORT_SYMBOL(RQF_MDS_CLOSE);
+const struct req_format RQF_MDS_READPAGE =
+ DEFINE_REQ_FMT0("MDS_READPAGE",
+ mdt_body_only, mdt_body_only);
+EXPORT_SYMBOL(RQF_MDS_READPAGE);
+
+/* formats for requests which delete last object */
+const struct req_format RQF_MDS_REINT_UNLINK_LAST =
+ DEFINE_REQ_FMT0("MDS_REINT_UNLINK_LAST", mds_reint_unlink_client,
+ mds_last_unlink_server);
+EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK_LAST);
+
+const struct req_format RQF_MDS_CLOSE_LAST =
+ DEFINE_REQ_FMT0("MDS_CLOSE_LAST", mdt_body_only, mds_last_unlink_server);
+EXPORT_SYMBOL(RQF_MDS_CLOSE_LAST);
+
+const struct req_format RQF_MDS_REINT_RENAME_LAST =
+ DEFINE_REQ_FMT0("MDS_REINT_RENAME_LAST", mds_reint_rename_client,
+ mds_last_unlink_server);
+EXPORT_SYMBOL(RQF_MDS_REINT_RENAME_LAST);
+
#if !defined(__REQ_LAYOUT_USER__)
int req_layout_init(void)