#define CHECK_MEMBER_OFFSET(s,m) \
do { \
- CHECK_VALUE (offsetof (s, m)); \
+ CHECK_VALUE(offsetof(s, m)); \
} while (0)
-#define CHECK_MEMBER_SIZEOF(s,m) \
-do { \
- CHECK_VALUE (sizeof (((s *)0)->m)); \
+#define CHECK_MEMBER_SIZEOF(s,m) \
+do { \
+ CHECK_VALUE((int)sizeof(((s *)0)->m)); \
} while (0)
#define CHECK_MEMBER(s,m) \
do { \
- CHECK_MEMBER_OFFSET (s, m); \
- CHECK_MEMBER_SIZEOF (s, m); \
+ CHECK_MEMBER_OFFSET(s, m); \
+ CHECK_MEMBER_SIZEOF(s, m); \
} while (0)
#define CHECK_STRUCT(s) \
do { \
- BLANK_LINE (); \
+ BLANK_LINE (); \
COMMENT ("Checks for struct "#s); \
- CHECK_VALUE (sizeof (s)); \
+ CHECK_VALUE((int)sizeof(s)); \
} while (0)
void
#include <linux/lustre_mds.h>
#include <linux/lustre_net.h>
-int client_import_connect(struct lustre_handle *dlm_handle,
+int client_import_connect(struct lustre_handle *dlm_handle,
struct obd_device *obd,
struct obd_uuid *cluuid)
{
request->rq_level = LUSTRE_CONN_NEW;
request->rq_replen = lustre_msg_size(0, NULL);
+ lustre_msg_add_op_flags(request->rq_reqmsg, MSG_CONNECT_PEER);
+
imp->imp_dlm_handle = *dlm_handle;
imp->imp_level = LUSTRE_CONN_CON;
imp->imp_replayable = 1;
CDEBUG(D_HA, "connected to replayable target: %s\n",
imp->imp_target_uuid.uuid);
+ ptlrpc_pinger_add_import(imp);
}
imp->imp_level = LUSTRE_CONN_FULL;
imp->imp_remote_handle = request->rq_repmsg->handle;
if (obd->obd_namespace != NULL) {
/* obd_no_recov == local only */
ldlm_cli_cancel_unused(obd->obd_namespace, NULL,
- obd->obd_no_recov);
+ obd->obd_no_recov, NULL);
ldlm_namespace_free(obd->obd_namespace);
obd->obd_namespace = NULL;
}
/* Yeah, obd_no_recov also (mainly) means "forced shutdown". */
if (obd->obd_no_recov) {
- ptlrpc_abort_inflight(imp);
+ ptlrpc_set_import_active(imp, 0);
} else {
request = ptlrpc_prep_req(imp, rq_opc, 0, NULL, NULL);
if (!request)
request->rq_replen = lustre_msg_size(0, NULL);
- /* Process disconnects even if we're waiting for recovery. */
- request->rq_level = LUSTRE_CONN_RECOVD;
-
rc = ptlrpc_queue_wait(request);
if (rc)
GOTO(out_req, rc);
}
+ if (imp->imp_replayable)
+ ptlrpc_pinger_del_import(imp);
+
EXIT;
out_req:
if (request)
struct obd_uuid remote_uuid;
struct list_head *p;
char *str, *tmp;
- int rc = 0, i, abort_recovery;
+ int rc = 0, abort_recovery;
+
ENTRY;
LASSERT_REQSWAB (req, 0);
- str = lustre_msg_string (req->rq_reqmsg, 0, sizeof (tgtuuid.uuid) - 1);
+ str = lustre_msg_string(req->rq_reqmsg, 0, sizeof(tgtuuid) - 1);
if (str == NULL) {
CERROR("bad target UUID for connect\n");
GOTO(out, rc = -EINVAL);
}
+
obd_str2uuid (&tgtuuid, str);
+ target = class_uuid2obd(&tgtuuid);
+ if (!target || target->obd_stopping || !target->obd_set_up) {
+ CERROR("UUID '%s' is not available for connect\n", str);
+ GOTO(out, rc = -ENODEV);
+ }
LASSERT_REQSWAB (req, 1);
- str = lustre_msg_string (req->rq_reqmsg, 1, sizeof (cluuid.uuid) - 1);
+ str = lustre_msg_string(req->rq_reqmsg, 1, sizeof(cluuid) - 1);
if (str == NULL) {
CERROR("bad client UUID for connect\n");
GOTO(out, rc = -EINVAL);
}
- obd_str2uuid (&cluuid, str);
- i = class_uuid2dev(&tgtuuid);
- if (i == -1) {
- CERROR("UUID '%s' not found for connect\n", tgtuuid.uuid);
- GOTO(out, rc = -ENODEV);
- }
-
- target = &obd_dev[i];
- if (!target || target->obd_stopping || !target->obd_set_up) {
- CERROR("UUID '%s' is not available for connect\n", str);
- GOTO(out, rc = -ENODEV);
- }
+ obd_str2uuid (&cluuid, str);
/* XXX extract a nettype and format accordingly */
snprintf(remote_uuid.uuid, sizeof remote_uuid,
class_disconnect_exports(obd, 0);
abort_delayed_replies(obd);
abort_recovery_queue(obd);
+ ptlrpc_run_recovery_over_upcall(obd);
}
static void target_recovery_expired(unsigned long castmeharder)
if (!recovering)
return;
- CDEBUG(D_ERROR, "timer will expire in %ld seconds\n",
- OBD_RECOVERY_TIMEOUT / HZ);
+ CERROR("timer will expire in %ld seconds\n", OBD_RECOVERY_TIMEOUT / HZ);
mod_timer(&obd->obd_recovery_timer, jiffies + OBD_RECOVERY_TIMEOUT);
}
if (recovery_done) {
struct list_head *tmp, *n;
ldlm_reprocess_all_ns(req->rq_export->exp_obd->obd_namespace);
- CDEBUG(D_ERROR,
- "%s: all clients recovered, sending delayed replies\n",
+ CERROR("%s: all clients recovered, sending delayed replies\n",
obd->obd_name);
obd->obd_recovering = 0;
list_for_each_safe(tmp, n, &obd->obd_delayed_reply_queue) {
-void mds_pack_req_body(struct ptlrpc_request *);
-void mds_pack_rep_body(struct ptlrpc_request *);
-void mds_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size,
+void mdc_pack_req_body(struct ptlrpc_request *);
+void mdc_pack_rep_body(struct ptlrpc_request *);
+void mdc_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size,
obd_id ino, int type);
-void mds_getattr_pack(struct ptlrpc_request *req, int valid, int offset,
+void mdc_getattr_pack(struct ptlrpc_request *req, int valid, int offset,
int flags, struct mdc_op_data *data);
-void mds_setattr_pack(struct ptlrpc_request *req,
+void mdc_setattr_pack(struct ptlrpc_request *req,
struct mdc_op_data *data,
- struct iattr *iattr, void *ea, int ealen);
-void mds_create_pack(struct ptlrpc_request *req, int offset,
+ struct iattr *iattr, void *ea, int ealen,
+ void *ea2, int ea2len);
+void mdc_create_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *op_data,
__u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
const void *data, int datalen);
-void mds_open_pack(struct ptlrpc_request *req, int offset,
+void mdc_open_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *op_data,
__u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
__u32 flags, const void *data, int datalen);
-void mds_unlink_pack(struct ptlrpc_request *req, int offset,
+void mdc_unlink_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *data);
-void mds_link_pack(struct ptlrpc_request *req, int offset,
+void mdc_link_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *data);
-void mds_rename_pack(struct ptlrpc_request *req, int offset,
+void mdc_rename_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *data,
const char *old, int oldlen, const char *new, int newlen);
#include <linux/lustre_mds.h>
#include <linux/lustre_lite.h>
-void mds_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size,
+void mdc_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size,
obd_id ino, int type, __u64 xid)
{
struct mds_body *b;
b->nlink = size; /* !! */
}
-static void mds_pack_body(struct mds_body *b)
+static void mdc_pack_body(struct mds_body *b)
{
LASSERT (b != NULL);
b->capability = current->cap_effective;
}
-void mds_pack_req_body(struct ptlrpc_request *req)
+void mdc_pack_req_body(struct ptlrpc_request *req)
{
struct mds_body *b = lustre_msg_buf(req->rq_reqmsg, 0, sizeof (*b));
- mds_pack_body(b);
+ mdc_pack_body(b);
}
/* packing of MDS records */
-void mds_create_pack(struct ptlrpc_request *req, int offset,
+void mdc_create_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *op_data,
__u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
const void *data, int datalen)
memcpy (tmp, data, datalen);
}
}
+
/* packing of MDS records */
-void mds_open_pack(struct ptlrpc_request *req, int offset,
+void mdc_open_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *op_data,
__u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
- __u32 flags,
- const void *data, int datalen)
+ __u32 flags, const void *data, int datalen)
{
struct mds_rec_create *rec;
char *tmp;
rec->cr_fsuid = current->fsuid;
rec->cr_fsgid = current->fsgid;
rec->cr_cap = current->cap_effective;
- ll_ino2fid(&rec->cr_fid, op_data->ino1,
- op_data->gen1, op_data->typ1);
+ if (op_data != NULL)
+ ll_ino2fid(&rec->cr_fid, op_data->ino1,
+ op_data->gen1, op_data->typ1);
memset(&rec->cr_replayfid, 0, sizeof(rec->cr_replayfid));
rec->cr_mode = mode;
rec->cr_flags = flags;
else
rec->cr_suppgid = -1;
- tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1, op_data->namelen + 1);
- LOGL0(op_data->name, op_data->namelen, tmp);
+ if (op_data->name) {
+ tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1,
+ op_data->namelen + 1);
+ LOGL0(op_data->name, op_data->namelen, tmp);
+ }
if (data) {
tmp = lustre_msg_buf(req->rq_reqmsg, offset + 2, datalen);
memcpy (tmp, data, datalen);
}
}
-void mds_setattr_pack(struct ptlrpc_request *req,
+
+void mdc_setattr_pack(struct ptlrpc_request *req,
struct mdc_op_data *data,
- struct iattr *iattr, void *ea, int ealen)
+ struct iattr *iattr, void *ea, int ealen,
+ void *ea2, int ea2len)
{
struct mds_rec_setattr *rec = lustre_msg_buf(req->rq_reqmsg, 0,
sizeof (*rec));
rec->sa_suppgid = -1;
}
- if (ealen != 0)
- memcpy(lustre_msg_buf(req->rq_reqmsg, 1, ealen), ea, ealen);
+ if (ealen == 0)
+ return;
+
+ memcpy(lustre_msg_buf(req->rq_reqmsg, 1, ealen), ea, ealen);
+
+ if (ea2len == 0)
+ return;
+
+ memcpy(lustre_msg_buf(req->rq_reqmsg, 2, ea2len), ea2, ea2len);
}
-void mds_unlink_pack(struct ptlrpc_request *req, int offset,
+void mdc_unlink_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *data)
{
struct mds_rec_unlink *rec;
LOGL0(data->name, data->namelen, tmp);
}
-void mds_link_pack(struct ptlrpc_request *req, int offset,
+void mdc_link_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *data)
{
struct mds_rec_link *rec;
LOGL0(data->name, data->namelen, tmp);
}
-void mds_rename_pack(struct ptlrpc_request *req, int offset,
+void mdc_rename_pack(struct ptlrpc_request *req, int offset,
struct mdc_op_data *data,
const char *old, int oldlen, const char *new, int newlen)
{
}
}
-void mds_getattr_pack(struct ptlrpc_request *req, int valid, int offset,
+void mdc_getattr_pack(struct ptlrpc_request *req, int valid, int offset,
int flags, struct mdc_op_data *data)
{
struct mds_body *b;
b->gid = inode->i_gid;
b->flags = inode->i_flags;
b->rdev = b->rdev;
- b->nlink = inode->i_nlink;
+ /* Return the correct link count for orphan inodes */
+ b->nlink = mds_inode_is_orphan(inode) ? 0 : inode->i_nlink;
b->generation = inode->i_generation;
b->suppgid = -1;
}
+
/* unpacking */
static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
struct mds_update_record *r)
struct mds_rec_setattr *rec;
ENTRY;
- rec = lustre_swab_reqbuf (req, offset, sizeof (*rec),
- lustre_swab_mds_rec_setattr);
+ rec = lustre_swab_reqbuf(req, offset, sizeof(*rec),
+ lustre_swab_mds_rec_setattr);
if (rec == NULL)
RETURN (-EFAULT);
if (r->ur_eadata == NULL)
RETURN (-EFAULT);
r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 1];
- } else {
- r->ur_eadata = NULL;
- r->ur_eadatalen = 0;
+ }
+
+ if (req->rq_reqmsg->bufcount > offset + 2) {
+ r->ur_logcookies = lustre_msg_buf(req->rq_reqmsg, offset + 2,0);
+ if (r->ur_eadata == NULL)
+ RETURN (-EFAULT);
+
+ r->ur_cookielen = req->rq_reqmsg->buflens[offset + 2];
}
RETURN(0);
if (r->ur_tgt == NULL)
RETURN (-EFAULT);
r->ur_tgtlen = req->rq_reqmsg->buflens[offset + 2];
- } else {
- r->ur_tgt = NULL;
- r->ur_tgtlen = 0;
}
RETURN(0);
}
#define CHECK_MEMBER_OFFSET(s,m) \
do { \
- CHECK_VALUE (offsetof (s, m)); \
+ CHECK_VALUE(offsetof(s, m)); \
} while (0)
-#define CHECK_MEMBER_SIZEOF(s,m) \
-do { \
- CHECK_VALUE (sizeof (((s *)0)->m)); \
+#define CHECK_MEMBER_SIZEOF(s,m) \
+do { \
+ CHECK_VALUE((int)sizeof(((s *)0)->m)); \
} while (0)
#define CHECK_MEMBER(s,m) \
do { \
- CHECK_MEMBER_OFFSET (s, m); \
- CHECK_MEMBER_SIZEOF (s, m); \
+ CHECK_MEMBER_OFFSET(s, m); \
+ CHECK_MEMBER_SIZEOF(s, m); \
} while (0)
#define CHECK_STRUCT(s) \
do { \
- BLANK_LINE (); \
+ BLANK_LINE (); \
COMMENT ("Checks for struct "#s); \
- CHECK_VALUE (sizeof (s)); \
+ CHECK_VALUE((int)sizeof(s)); \
} while (0)
void
#define CHECK_DEFINE(a) \
do { \
- printf (" LASSERT ("#a" == "STRINGIFY(a)");\n"); \
+ printf(" LASSERT ("#a" == "STRINGIFY(a)");\n"); \
} while (0)
#define CHECK_VALUE(a) \
do { \
- printf (" LASSERT ("#a" == %d);\n", a); \
+ printf(" LASSERT ("#a" == %d);\n", a); \
} while (0)
#define CHECK_MEMBER_OFFSET(s,m) \
do { \
- CHECK_VALUE (offsetof (struct s, m)); \
+ CHECK_VALUE(offsetof (struct s, m)); \
} while (0)
#define CHECK_MEMBER_SIZEOF(s,m) \
do { \
- CHECK_VALUE (sizeof (((struct s *)0)->m)); \
+ CHECK_VALUE((int)sizeof(((struct s *)0)->m)); \
} while (0)
#define CHECK_MEMBER(s,m) \
do { \
- CHECK_MEMBER_OFFSET (s, m); \
- CHECK_MEMBER_SIZEOF (s, m); \
+ CHECK_MEMBER_OFFSET(s, m); \
+ CHECK_MEMBER_SIZEOF(s, m); \
} while (0)
#define CHECK_STRUCT(s) \
do { \
- COMMENT ("Checks for struct "#s); \
- CHECK_VALUE (sizeof (struct s)); \
+ COMMENT("Checks for struct "#s); \
+ CHECK_VALUE((int)sizeof(struct s)); \
} while (0)