*
* You should have received a copy of the GNU General Public License
* version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2015, Intel Corporation.
+ * Copyright (c) 2011, 2016, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
ptlrpc_status_ntoh(lcd->lcd_last_close_result);
}
- CDEBUG(D_INFO, "%s: read lcd @%lld uuid = %s, last_transno = "LPU64
- ", last_xid = "LPU64", last_result = %u, last_data = %u, "
- "last_close_transno = "LPU64", last_close_xid = "LPU64", "
+ CDEBUG(D_INFO, "%s: read lcd @%lld uuid = %s, last_transno = %llu"
+ ", last_xid = %llu, last_result = %u, last_data = %u, "
+ "last_close_transno = %llu, last_close_xid = %llu, "
"last_close_result = %u, rc = %d\n", tgt->lut_obd->obd_name,
*off, lcd->lcd_uuid, lcd->lcd_last_transno, lcd->lcd_last_xid,
lcd->lcd_last_result, lcd->lcd_last_data,
RETURN(PTR_ERR(th));
tti_buf_lcd(tti);
- mutex_lock(&ted->ted_lcd_lock);
rc = dt_declare_record_write(env, tgt->lut_last_rcvd,
&tti->tti_buf,
ted->ted_lr_off, th);
rc = dt_trans_start_local(env, tgt->lut_bottom, th);
if (rc)
GOTO(out, rc);
+
+ mutex_lock(&ted->ted_lcd_lock);
+
/*
* Until this operations will be committed the sync is needed
* for this export. This should be done _after_ starting the
tti->tti_off = ted->ted_lr_off;
rc = tgt_client_data_write(env, tgt, ted->ted_lcd, &tti->tti_off, th);
+
+ mutex_unlock(&ted->ted_lcd_lock);
+
EXIT;
out:
- mutex_unlock(&ted->ted_lcd_lock);
dt_trans_stop(env, tgt->lut_bottom, th);
CDEBUG(D_INFO, "%s: update last_rcvd client data for UUID = %s, "
- "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+ "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
return rc;
lsd_le_to_cpu(&tti->tti_lsd, &tgt->lut_lsd);
CDEBUG(D_INFO, "%s: read last_rcvd server data for UUID = %s, "
- "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+ "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
return rc;
}
rc = dt_record_write(env, dto, &tti->tti_buf, &tti->tti_off, th);
CDEBUG(D_INFO, "%s: write last_rcvd server data for UUID = %s, "
- "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+ "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
RETURN(rc);
ENTRY;
CDEBUG(D_SUPER,
- "%s: mount_count is "LPU64", last_transno is "LPU64"\n",
+ "%s: mount_count is %llu, last_transno is %llu\n",
tgt->lut_lsd.lsd_uuid, tgt->lut_obd->u.obt.obt_mount_count,
tgt->lut_last_transno);
dt_trans_stop(env, tgt->lut_bottom, th);
CDEBUG(D_INFO, "%s: update last_rcvd server data for UUID = %s, "
- "last_transno = "LPU64": rc = %d\n", tgt->lut_obd->obd_name,
+ "last_transno = %llu: rc = %d\n", tgt->lut_obd->obd_name,
tgt->lut_lsd.lsd_uuid, tgt->lut_lsd.lsd_last_transno, rc);
RETURN(rc);
}
LASSERT(ccb->llcc_tgt != NULL);
LASSERT(ccb->llcc_exp->exp_obd == ccb->llcc_tgt->lut_obd);
+ /* error hit, don't update last committed to provide chance to
+ * replay data after fail */
+ if (err != 0)
+ goto out;
+
/* Fast path w/o spinlock, if exp_last_committed was updated
* with higher transno, no need to take spinlock and check,
* also no need to update obd_last_committed. */
spin_unlock(&ccb->llcc_tgt->lut_translock);
ptlrpc_commit_replies(ccb->llcc_exp);
- tgt_cancel_slc_locks(ccb->llcc_transno);
+ tgt_cancel_slc_locks(ccb->llcc_tgt, ccb->llcc_transno);
} else {
spin_unlock(&ccb->llcc_tgt->lut_translock);
}
+
+ CDEBUG(D_HA, "%s: transno %lld is committed\n",
+ ccb->llcc_tgt->lut_obd->obd_name, ccb->llcc_transno);
+
out:
class_export_cb_put(ccb->llcc_exp);
- if (ccb->llcc_transno)
- CDEBUG(D_HA, "%s: transno "LPD64" is committed\n",
- ccb->llcc_tgt->lut_obd->obd_name, ccb->llcc_transno);
OBD_FREE_PTR(ccb);
}
+/**
+ * Add commit callback function, it returns a non-zero value to inform
+ * caller to use sync transaction if necessary.
+ */
int tgt_last_commit_cb_add(struct thandle *th, struct lu_target *tgt,
struct obd_export *exp, __u64 transno)
{
/* report failure to force synchronous operation */
return -EPERM;
- return rc;
+ /* if exp_need_sync is set, return non-zero value to force
+ * a sync transaction. */
+ return rc ? rc : exp->exp_need_sync;
}
struct tgt_new_client_callback {
exp_connect_flags(exp) & OBD_CONNECT_LIGHTWEIGHT)
RETURN(0);
+ /* Slot may be not yet assigned, use case is race between Client
+ * reconnect and forced eviction */
+ if (ted->ted_lr_idx < 0) {
+ CWARN("%s: client with UUID '%s' not in bitmap\n",
+ tgt->lut_obd->obd_name, ted->ted_lcd->lcd_uuid);
+ RETURN(0);
+ }
+
CDEBUG(D_INFO, "%s: del client at idx %u, off %lld, UUID '%s'\n",
tgt->lut_obd->obd_name, ted->ted_lr_idx, ted->ted_lr_off,
ted->ted_lcd->lcd_uuid);
if (exp->exp_flags & OBD_OPT_FAILOVER)
RETURN(0);
+ if (OBD_FAIL_CHECK(OBD_FAIL_TGT_CLIENT_DEL))
+ RETURN(0);
+
/* Make sure the server's last_transno is up to date.
* This should be done before zeroing client slot so last_transno will
* be in server data or in client data in case of failure */
spin_lock(&tgt->lut_translock);
if (th->th_result != 0) {
if (tti->tti_transno != 0) {
- CERROR("%s: replay transno "LPU64" failed: rc = %d\n",
+ CERROR("%s: replay transno %llu failed: rc = %d\n",
tgt_name(tgt), tti->tti_transno, th->th_result);
}
} else if (tti->tti_transno == 0) {
}
/* filling reply data */
- CDEBUG(D_INODE, "transno = "LPU64", last_committed = "LPU64"\n",
+ CDEBUG(D_INODE, "transno = %llu, last_committed = %llu\n",
tti->tti_transno, tgt->lut_obd->obd_last_committed);
if (req != NULL) {
if (*transno_p > tti->tti_transno) {
if (!tgt->lut_no_reconstruct) {
CERROR("%s: trying to overwrite bigger transno:"
- "on-disk: "LPU64", new: "LPU64" replay: "
+ "on-disk: %llu, new: %llu replay: "
"%d. See LU-617.\n", tgt_name(tgt),
*transno_p, tti->tti_transno,
req_is_replay(req));
if (!lw_client) {
tti->tti_off = ted->ted_lr_off;
- rc = tgt_client_data_write(env, tgt, ted->ted_lcd, &tti->tti_off, th);
+ if (CFS_FAIL_CHECK(OBD_FAIL_TGT_RCVD_EIO))
+ rc = -EIO;
+ else
+ rc = tgt_client_data_write(env, tgt, ted->ted_lcd,
+ &tti->tti_off, th);
if (rc < 0) {
mutex_unlock(&ted->ted_lcd_lock);
RETURN(rc);
/* These exports are cleaned up by disconnect, so they
* need to be set up like real exports as connect does.
*/
- CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: "LPU64
- " srv lr: "LPU64" lx: "LPU64" gen %u\n", lcd->lcd_uuid,
+ CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: %llu"
+ " srv lr: %llu lx: %llu gen %u\n", lcd->lcd_uuid,
cl_idx, last_transno, lsd->lsd_last_transno,
lcd_last_xid(lcd), lcd->lcd_generation);
}
/* Need to check last_rcvd even for duplicated exports. */
- CDEBUG(D_OTHER, "client at idx %d has last_transno = "LPU64"\n",
+ CDEBUG(D_OTHER, "client at idx %d has last_transno = %llu\n",
cl_idx, last_transno);
spin_lock(&tgt->lut_translock);
lsd->lsd_mount_count++;
CDEBUG(D_INODE, "=======,=BEGIN DUMPING LAST_RCVD========\n");
- CDEBUG(D_INODE, "%s: server last_transno: "LPU64"\n",
+ CDEBUG(D_INODE, "%s: server last_transno: %llu\n",
tgt_name(tgt), tgt->lut_last_transno);
- CDEBUG(D_INODE, "%s: server mount_count: "LPU64"\n",
+ CDEBUG(D_INODE, "%s: server mount_count: %llu\n",
tgt_name(tgt), lsd->lsd_mount_count);
CDEBUG(D_INODE, "%s: server data size: %u\n",
tgt_name(tgt), lsd->lsd_server_size);
* because a replay slot has not been assigned. This should be
* replaced by dmu_tx_hold_append() when available.
*/
- tti->tti_off = atomic_read(&tgt->lut_num_clients) * 8 *
- sizeof(struct lsd_reply_data);
tti->tti_buf.lb_buf = NULL;
tti->tti_buf.lb_len = sizeof(struct lsd_reply_data);
dto = dt_object_locate(tgt->lut_reply_data, th->th_dev);
- rc = dt_declare_record_write(env, dto, &tti->tti_buf,
- tti->tti_off, th);
+ rc = dt_declare_record_write(env, dto, &tti->tti_buf, -1, th);
if (rc)
return rc;
} else {
if (tti->tti_has_trans && !echo_client) {
if (tti->tti_mult_trans == 0) {
- CDEBUG(D_HA, "More than one transaction "LPU64"\n",
+ CDEBUG(D_HA, "More than one transaction %llu\n",
tti->tti_transno);
RETURN(0);
}