void mgs_revoke_lock(struct obd_device *obd, struct fs_db *fsdb, int type) { ldlm_completion_callback cp = NULL; struct lustre_handle lockh = { 0 }; struct ldlm_res_id res_id; int flags = LDLM_FL_ATOMIC_CB; int rc; ENTRY; LASSERT(fsdb->fsdb_name[0] != '\0'); rc = mgc_fsname2resid(fsdb->fsdb_name, &res_id, type); LASSERT(rc == 0); switch (type) { case CONFIG_T_CONFIG: cp = mgs_completion_ast_config; if (cfs_test_and_set_bit(FSDB_REVOKING_LOCK, &fsdb->fsdb_flags)) rc = -EALREADY; break; case CONFIG_T_RECOVER: cp = mgs_completion_ast_ir; default: break; } if (!rc) { LASSERT(cp != NULL); rc = ldlm_cli_enqueue_local(obd->obd_namespace, &res_id, LDLM_PLAIN, NULL, LCK_EX, &flags, ldlm_blocking_ast, cp, NULL, fsdb, 0, NULL, &lockh); if (rc != ELDLM_OK) { CERROR("can't take cfg lock for "LPX64"/"LPX64"(%d)\n", le64_to_cpu(res_id.name[0]), le64_to_cpu(res_id.name[1]), rc); if (type == CONFIG_T_CONFIG) cfs_clear_bit(FSDB_REVOKING_LOCK, &fsdb->fsdb_flags); } /* lock has been cancelled in completion_ast. */ } RETURN_EXIT; }
int __obd_fail_check_set(__u32 id, __u32 value, int set) { static cfs_atomic_t obd_fail_count = CFS_ATOMIC_INIT(0); LASSERT(!(id & OBD_FAIL_ONCE)); if ((obd_fail_loc & (OBD_FAILED | OBD_FAIL_ONCE)) == (OBD_FAILED | OBD_FAIL_ONCE)) { cfs_atomic_set(&obd_fail_count, 0); /* paranoia */ return 0; } /* Fail 1/obd_fail_val times */ if (obd_fail_loc & OBD_FAIL_RAND) { if (obd_fail_val < 2 || cfs_rand() % obd_fail_val > 0) return 0; } /* Skip the first obd_fail_val, then fail */ if (obd_fail_loc & OBD_FAIL_SKIP) { if (cfs_atomic_inc_return(&obd_fail_count) <= obd_fail_val) return 0; } /* Fail obd_fail_val times, overridden by FAIL_ONCE */ if (obd_fail_loc & OBD_FAIL_SOME && (!(obd_fail_loc & OBD_FAIL_ONCE) || obd_fail_val <= 1)) { int count = cfs_atomic_inc_return(&obd_fail_count); if (count >= obd_fail_val) { cfs_set_bit(OBD_FAIL_ONCE_BIT, &obd_fail_loc); cfs_atomic_set(&obd_fail_count, 0); /* we are lost race to increase obd_fail_count */ if (count > obd_fail_val) return 0; } } if ((set == OBD_FAIL_LOC_ORSET || set == OBD_FAIL_LOC_RESET) && (value & OBD_FAIL_ONCE)) cfs_set_bit(OBD_FAIL_ONCE_BIT, &obd_fail_loc); /* Lost race to set OBD_FAILED_BIT. */ if (cfs_test_and_set_bit(OBD_FAILED_BIT, &obd_fail_loc)) { /* If OBD_FAIL_ONCE is valid, only one process can fail, * otherwise multi-process can fail at the same time. */ if (obd_fail_loc & OBD_FAIL_ONCE) return 0; } switch (set) { case OBD_FAIL_LOC_NOSET: break; case OBD_FAIL_LOC_ORSET: obd_fail_loc |= value & ~(OBD_FAILED | OBD_FAIL_ONCE); break; case OBD_FAIL_LOC_RESET: obd_fail_loc = value; break; default: LASSERTF(0, "called with bad set %u\n", set); break; } return 1; }
int __cfs_fail_check_set(__u32 id, __u32 value, int set) { static cfs_atomic_t cfs_fail_count = CFS_ATOMIC_INIT(0); LASSERT(!(id & CFS_FAIL_ONCE)); if ((cfs_fail_loc & (CFS_FAILED | CFS_FAIL_ONCE)) == (CFS_FAILED | CFS_FAIL_ONCE)) { cfs_atomic_set(&cfs_fail_count, 0); /* paranoia */ return 0; } /* Fail 1/cfs_fail_val times */ if (cfs_fail_loc & CFS_FAIL_RAND) { if (cfs_fail_val < 2 || cfs_rand() % cfs_fail_val > 0) return 0; } /* Skip the first cfs_fail_val, then fail */ if (cfs_fail_loc & CFS_FAIL_SKIP) { if (cfs_atomic_inc_return(&cfs_fail_count) <= cfs_fail_val) return 0; } /* check cfs_fail_val... */ if (set == CFS_FAIL_LOC_VALUE) { if (cfs_fail_val != -1 && cfs_fail_val != value) return 0; } /* Fail cfs_fail_val times, overridden by FAIL_ONCE */ if (cfs_fail_loc & CFS_FAIL_SOME && (!(cfs_fail_loc & CFS_FAIL_ONCE) || cfs_fail_val <= 1)) { int count = cfs_atomic_inc_return(&cfs_fail_count); if (count >= cfs_fail_val) { cfs_set_bit(CFS_FAIL_ONCE_BIT, &cfs_fail_loc); cfs_atomic_set(&cfs_fail_count, 0); /* we are lost race to increase */ if (count > cfs_fail_val) return 0; } } if ((set == CFS_FAIL_LOC_ORSET || set == CFS_FAIL_LOC_RESET) && (value & CFS_FAIL_ONCE)) cfs_set_bit(CFS_FAIL_ONCE_BIT, &cfs_fail_loc); /* Lost race to set CFS_FAILED_BIT. */ if (cfs_test_and_set_bit(CFS_FAILED_BIT, &cfs_fail_loc)) { /* If CFS_FAIL_ONCE is valid, only one process can fail, * otherwise multi-process can fail at the same time. */ if (cfs_fail_loc & CFS_FAIL_ONCE) return 0; } switch (set) { case CFS_FAIL_LOC_NOSET: case CFS_FAIL_LOC_VALUE: break; case CFS_FAIL_LOC_ORSET: cfs_fail_loc |= value & ~(CFS_FAILED | CFS_FAIL_ONCE); break; case CFS_FAIL_LOC_RESET: cfs_fail_loc = value; break; default: LASSERTF(0, "called with bad set %u\n", set); break; } return 1; }