diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2010-03-26 03:17:42 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2010-03-26 03:17:42 (GMT) |
commit | 49cd4a1f3affeaff363242114ca89f9c61876e0e (patch) | |
tree | 624777f4ef5f28e5a3e010e4397c75e52f7cd02f /src/H5AC.c | |
parent | 9a359c82243eb630ab4338dba08796d2d7e43e1a (diff) | |
download | hdf5-49cd4a1f3affeaff363242114ca89f9c61876e0e.zip hdf5-49cd4a1f3affeaff363242114ca89f9c61876e0e.tar.gz hdf5-49cd4a1f3affeaff363242114ca89f9c61876e0e.tar.bz2 |
[svn-r18460] Description:
Fold metadata journaling changes into the trunk: mostly tweaky
small stuff, also removed the H5F_t* field from the H5G_entry_t struct.
Tested on:
FreeBSD/32 6.3 (duty) in debug mode
FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (jam) w/PGI compilers, w/default API=1.8.x,
w/C++ & FORTRAN, w/threadsafe, in debug mode
Linux/64-amd64 2.6 (amani) w/Intel compilers, w/default API=1.6.x,
w/C++ & FORTRAN, in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in debug mode
Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in production mode
Diffstat (limited to 'src/H5AC.c')
-rw-r--r-- | src/H5AC.c | 182 |
1 files changed, 73 insertions, 109 deletions
@@ -395,7 +395,6 @@ H5AC_term_interface(void) H5AC_dxpl_id=(-1); H5AC_noblock_dxpl_id=(-1); H5AC_ind_dxpl_id=(-1); - #endif /* H5_HAVE_PARALLEL */ /* Reset interface initialization flag */ H5_interface_initialize_g = 0; @@ -619,40 +618,40 @@ H5AC_create(const H5F_t *f, if ( aux_ptr->mpi_rank == 0 ) { f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, - H5AC__DEFAULT_MIN_CLEAN_SIZE, - (H5AC_NTYPES - 1), - (const char **)H5AC_entry_type_names, - H5AC_check_if_write_permitted, - TRUE, - H5AC_log_flushed_entry, - (void *)aux_ptr); + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + H5AC_check_if_write_permitted, + TRUE, + H5AC_log_flushed_entry, + (void *)aux_ptr); } else { f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, - H5AC__DEFAULT_MIN_CLEAN_SIZE, - (H5AC_NTYPES - 1), - (const char **)H5AC_entry_type_names, - NULL, - FALSE, + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + NULL, + FALSE, #if 0 /* this is useful debugging code -- keep it for a while */ /* JRM */ - H5AC_log_flushed_entry_dummy, + H5AC_log_flushed_entry_dummy, #else /* JRM */ - NULL, + NULL, #endif /* JRM */ - (void *)aux_ptr); + (void *)aux_ptr); } } else { f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, - H5AC__DEFAULT_MIN_CLEAN_SIZE, - (H5AC_NTYPES - 1), - (const char **)H5AC_entry_type_names, - H5AC_check_if_write_permitted, - TRUE, - NULL, - NULL); + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + H5AC_check_if_write_permitted, + TRUE, + NULL, + NULL); } } else { #endif /* H5_HAVE_PARALLEL */ @@ -661,13 +660,13 @@ H5AC_create(const H5F_t *f, * -- JRM */ f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, - H5AC__DEFAULT_MIN_CLEAN_SIZE, - (H5AC_NTYPES - 1), - (const char **)H5AC_entry_type_names, - H5AC_check_if_write_permitted, - TRUE, - NULL, - NULL); + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + H5AC_check_if_write_permitted, + TRUE, + NULL, + NULL); #ifdef H5_HAVE_PARALLEL } #endif /* H5_HAVE_PARALLEL */ @@ -829,12 +828,12 @@ H5AC_expunge_entry(H5F_t *f, haddr_t addr, unsigned flags) { - herr_t result; + herr_t result; #if H5AC__TRACE_FILE_ENABLED char trace[128] = ""; FILE * trace_file_ptr = NULL; #endif /* H5AC__TRACE_FILE_ENABLED */ - herr_t ret_value = SUCCEED; /* Return value */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5AC_expunge_entry, FAIL) @@ -850,7 +849,6 @@ H5AC_expunge_entry(H5F_t *f, { H5AC_t * cache_ptr = f->shared->cache; - /* For the expunge entry call, only the addr, and type id are really * necessary in the trace file. Write the return value to catch occult * errors. @@ -859,7 +857,7 @@ H5AC_expunge_entry(H5F_t *f, ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { - sprintf(trace, "H5AC_expunge_entry %lx %d", + sprintf(trace, "H5AC_expunge_entry 0x%lx %d", (unsigned long)addr, (int)(type->id)); } @@ -925,6 +923,7 @@ H5AC_flush(H5F_t *f, hid_t dxpl_id) FUNC_ENTER_NOAPI(H5AC_flush, FAIL) HDassert(f); + HDassert(f->shared); HDassert(f->shared->cache); #if H5AC__TRACE_FILE_ENABLED @@ -1057,9 +1056,6 @@ done: * exist on disk yet, but it must have an address and disk * space reserved. * - * If H5AC_DEBUG is defined then this function checks - * that the object being inserted isn't a protected object. - * * Return: Non-negative on success/Negative on failure * * Programmer: Robb Matzke @@ -1133,6 +1129,7 @@ H5AC_set(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, FUNC_ENTER_NOAPI(H5AC_set, FAIL) HDassert(f); + HDassert(f->shared); HDassert(f->shared->cache); HDassert(type); HDassert(type->flush); @@ -1155,7 +1152,7 @@ H5AC_set(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, if ( ( f != NULL ) && ( f->shared != NULL ) && ( f->shared->cache != NULL ) && - ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC_set 0x%lx %d 0x%x", @@ -1357,8 +1354,8 @@ H5AC_mark_pinned_or_protected_entry_dirty(void *thing) * occult errors. */ if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && - (NULL != trace_file_ptr)) - sprintf(trace, "%s %lx", FUNC, + (NULL != trace_file_ptr)) + sprintf(trace, "%s 0x%lx", FUNC, (unsigned long)(((H5C_cache_entry_t *)thing)->addr)); #endif /* H5AC__TRACE_FILE_ENABLED */ @@ -1371,7 +1368,7 @@ H5AC_mark_pinned_or_protected_entry_dirty(void *thing) HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); if((!entry_ptr->is_dirty) && (!entry_ptr->is_protected) && - (entry_ptr->is_pinned) && (NULL != cache_ptr->aux_ptr)) { + (entry_ptr->is_pinned) && (NULL != cache_ptr->aux_ptr)) { if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr, FALSE, 0) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry") } /* end if */ @@ -1397,10 +1394,6 @@ done: * Purpose: Use this function to notify the cache that an object's * file address changed. * - * If H5AC_DEBUG is defined then this function checks - * that the old and new addresses don't correspond to the - * address of a protected object. - * * Return: Non-negative on success/Negative on failure * * Programmer: Robb Matzke @@ -1466,10 +1459,10 @@ H5AC_rename(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, haddr_t new_ad if ( ( f != NULL ) && ( f->shared != NULL ) && ( f->shared->cache != NULL ) && - ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && ( trace_file_ptr != NULL ) ) { - sprintf(trace, "H5AC_rename %lx %lx %d", + sprintf(trace, "H5AC_rename 0x%lx 0x%lx %d", (unsigned long)old_addr, (unsigned long)new_addr, (int)(type->id)); @@ -1559,11 +1552,11 @@ H5AC_pin_protected_entry(void *thing) */ if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && (NULL != trace_file_ptr)) - sprintf(trace, "%s %lx", FUNC, + sprintf(trace, "%s 0x%lx", FUNC, (unsigned long)(((H5C_cache_entry_t *)thing)->addr)); #endif /* H5AC__TRACE_FILE_ENABLED */ - if(H5C_pin_protected_entry(thing) < 0 ) + if(H5C_pin_protected_entry(thing) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "can't pin entry") done: @@ -1656,9 +1649,6 @@ done: * The caller must call H5AC_unprotect() when finished with * the pointer. * - * If H5AC_DEBUG is defined then we check that the - * requested object isn't already protected. - * * Return: Success: Ptr to the object. * * Failure: NULL @@ -1740,7 +1730,7 @@ H5AC_protect(H5F_t *f, if ( ( f != NULL ) && ( f->shared != NULL ) && ( f->shared->cache != NULL ) && - ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && ( trace_file_ptr != NULL ) ) { char * rw_string; @@ -1758,7 +1748,7 @@ H5AC_protect(H5F_t *f, rw_string = "???"; } - sprintf(trace, "H5AC_protect %lx %d %s", + sprintf(trace, "H5AC_protect 0x%lx %d %s", (unsigned long)addr, (int)(type->id), rw_string); @@ -1898,7 +1888,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5AC_unpin_entry(void * thing) +H5AC_unpin_entry(void *thing) { #if H5AC__TRACE_FILE_ENABLED char trace[128] = ""; @@ -1917,7 +1907,7 @@ H5AC_unpin_entry(void * thing) */ if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && (NULL != trace_file_ptr)) - sprintf(trace, "%s %lx", FUNC, + sprintf(trace, "%s 0x%lx", FUNC, (unsigned long)(((H5C_cache_entry_t *)thing)->addr)); #endif /* H5AC__TRACE_FILE_ENABLED */ @@ -2014,10 +2004,6 @@ done: * If the DELETED flag is set, then this object has been deleted * from the file and should not be returned to the cache. * - * If H5AC_DEBUG is defined then this function fails - * if the TYPE and ADDR arguments are not what was used when the - * object was protected or if the object was never protected. - * * Return: Non-negative on success/Negative on failure * * Programmer: Robb Matzke @@ -2082,7 +2068,6 @@ H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, void *thing, unsigned flags) { herr_t result; - herr_t ret_value=SUCCEED; /* Return value */ hbool_t dirtied; size_t new_size = 0; #ifdef H5_HAVE_PARALLEL @@ -2095,10 +2080,12 @@ H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, unsigned trace_flags = 0; FILE * trace_file_ptr = NULL; #endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value=SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5AC_unprotect, FAIL) HDassert(f); + HDassert(f->shared); HDassert(f->shared->cache); HDassert(type); HDassert(type->clear); @@ -2116,10 +2103,10 @@ H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, if ( ( f != NULL ) && ( f->shared != NULL ) && ( f->shared->cache != NULL ) && - ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && ( trace_file_ptr != NULL ) ) { - sprintf(trace, "H5AC_unprotect %lx %d", + sprintf(trace, "H5AC_unprotect 0x%lx %d", (unsigned long)addr, (int)(type->id)); @@ -2304,6 +2291,7 @@ H5AC_stats(const H5F_t *f) FUNC_ENTER_NOAPI(H5AC_stats, FAIL) HDassert(f); + HDassert(f->shared); HDassert(f->shared->cache); /* at present, this can't fail */ @@ -2429,9 +2417,9 @@ H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr, config_ptr->max_increment = internal_config.max_increment; config_ptr->decr_mode = internal_config.decr_mode; config_ptr->upper_hr_threshold = internal_config.upper_hr_threshold; - config_ptr->flash_incr_mode = internal_config.flash_incr_mode; - config_ptr->flash_multiple = internal_config.flash_multiple; - config_ptr->flash_threshold = internal_config.flash_threshold; + config_ptr->flash_incr_mode = internal_config.flash_incr_mode; + config_ptr->flash_multiple = internal_config.flash_multiple; + config_ptr->flash_threshold = internal_config.flash_threshold; config_ptr->decrement = internal_config.decrement; config_ptr->apply_max_decrement = internal_config.apply_max_decrement; config_ptr->max_decrement = internal_config.max_decrement; @@ -2478,7 +2466,6 @@ done: * *------------------------------------------------------------------------- */ - herr_t H5AC_get_cache_size(H5AC_t * cache_ptr, size_t * max_size_ptr, @@ -2526,29 +2513,18 @@ done: * *------------------------------------------------------------------------- */ - herr_t -H5AC_get_cache_hit_rate(H5AC_t * cache_ptr, - double * hit_rate_ptr) - +H5AC_get_cache_hit_rate(H5AC_t * cache_ptr, double * hit_rate_ptr) { - herr_t result; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5AC_get_cache_hit_rate, FAIL) - result = H5C_get_cache_hit_rate((H5C_t *)cache_ptr, hit_rate_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C_get_cache_hit_rate() failed.") - } + if(H5C_get_cache_hit_rate((H5C_t *)cache_ptr, hit_rate_ptr) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_cache_hit_rate() failed.") done: - FUNC_LEAVE_NOAPI(ret_value) - } /* H5AC_get_cache_hit_rate() */ @@ -2629,7 +2605,6 @@ done: * *------------------------------------------------------------------------- */ - herr_t H5AC_set_cache_auto_resize_config(H5AC_t *cache_ptr, H5AC_cache_config_t *config_ptr) @@ -2842,15 +2817,13 @@ done: * *------------------------------------------------------------------------- */ - herr_t H5AC_validate_config(H5AC_cache_config_t * config_ptr) - { herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - size_t name_len; + int name_len; H5C_auto_size_ctl_t internal_config; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5AC_validate_config, FAIL) @@ -3038,7 +3011,6 @@ done: * *------------------------------------------------------------------------- */ - herr_t H5AC_open_trace_file(H5AC_t * cache_ptr, const char * trace_file_name) @@ -3119,7 +3091,7 @@ H5AC_open_trace_file(H5AC_t * cache_ptr, HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.") } - HDfprintf(file_ptr, "### HDF5 metadata cache trace file version 1 ###\n"); + HDfprintf(file_ptr, "### HDF5 metadata cache trace file ###\n"); if ( H5C_set_trace_file_ptr(cache_ptr, file_ptr) < 0 ) { @@ -3181,7 +3153,7 @@ H5AC_broadcast_clean_list(H5AC_t * cache_ptr) HDassert( cache_ptr != NULL ); HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); - aux_ptr = cache_ptr->aux_ptr; + aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr); HDassert( aux_ptr != NULL ); HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); @@ -3420,11 +3392,10 @@ done: * * Updated function for flash cache increment fields. * - * JRM -- 1/2/08 + * JRM -- 1/2/08 * *------------------------------------------------------------------------- */ - herr_t H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr, H5C_auto_size_ctl_t * int_conf_ptr) @@ -3456,32 +3427,28 @@ H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr, int_conf_ptr->min_clean_fraction = ext_conf_ptr->min_clean_fraction; int_conf_ptr->max_size = ext_conf_ptr->max_size; int_conf_ptr->min_size = ext_conf_ptr->min_size; - int_conf_ptr->epoch_length = - (int64_t)(ext_conf_ptr->epoch_length); + int_conf_ptr->epoch_length = (int64_t)(ext_conf_ptr->epoch_length); int_conf_ptr->incr_mode = ext_conf_ptr->incr_mode; int_conf_ptr->lower_hr_threshold = ext_conf_ptr->lower_hr_threshold; int_conf_ptr->increment = ext_conf_ptr->increment; int_conf_ptr->apply_max_increment = ext_conf_ptr->apply_max_increment; int_conf_ptr->max_increment = ext_conf_ptr->max_increment; - int_conf_ptr->flash_incr_mode = ext_conf_ptr->flash_incr_mode; - int_conf_ptr->flash_multiple = ext_conf_ptr->flash_multiple; - int_conf_ptr->flash_threshold = ext_conf_ptr->flash_threshold; + int_conf_ptr->flash_incr_mode = ext_conf_ptr->flash_incr_mode; + int_conf_ptr->flash_multiple = ext_conf_ptr->flash_multiple; + int_conf_ptr->flash_threshold = ext_conf_ptr->flash_threshold; int_conf_ptr->decr_mode = ext_conf_ptr->decr_mode; int_conf_ptr->upper_hr_threshold = ext_conf_ptr->upper_hr_threshold; int_conf_ptr->decrement = ext_conf_ptr->decrement; int_conf_ptr->apply_max_decrement = ext_conf_ptr->apply_max_decrement; int_conf_ptr->max_decrement = ext_conf_ptr->max_decrement; - int_conf_ptr->epochs_before_eviction = - (int32_t)(ext_conf_ptr->epochs_before_eviction); + int_conf_ptr->epochs_before_eviction = (int32_t)(ext_conf_ptr->epochs_before_eviction); int_conf_ptr->apply_empty_reserve = ext_conf_ptr->apply_empty_reserve; int_conf_ptr->empty_reserve = ext_conf_ptr->empty_reserve; done: - FUNC_LEAVE_NOAPI(ret_value) - } /* H5AC_ext_config_2_int_config() */ @@ -3631,7 +3598,7 @@ H5AC_log_dirtied_entry(const H5AC_info_t * entry_ptr, FUNC_ENTER_NOAPI(H5AC_log_dirtied_entry, FAIL) - HDassert( entry_ptr != NULL ); + HDassert( entry_ptr ); HDassert( entry_ptr->addr == addr ); HDassert( entry_ptr->is_dirty == FALSE ); @@ -4060,7 +4027,6 @@ done: * *------------------------------------------------------------------------- */ - #ifdef H5_HAVE_PARALLEL static herr_t H5AC_log_renamed_entry(const H5F_t *f, @@ -4068,12 +4034,12 @@ H5AC_log_renamed_entry(const H5F_t *f, haddr_t new_addr) { H5AC_t * cache_ptr; - herr_t ret_value = SUCCEED; /* Return value */ hbool_t entry_in_cache; hbool_t entry_dirty; size_t entry_size; H5AC_aux_t * aux_ptr = NULL; H5AC_slist_entry_t * slist_entry_ptr = NULL; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5AC_log_renamed_entry, FAIL) @@ -4310,7 +4276,7 @@ H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t * f, HDassert( cache_ptr != NULL ); HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); - aux_ptr = cache_ptr->aux_ptr; + aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr); HDassert( aux_ptr != NULL ); HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); @@ -4345,8 +4311,7 @@ H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t * f, aux_ptr->write_permitted = TRUE; - result = H5C_flush_to_min_clean(f, dxpl_id, H5AC_noblock_dxpl_id, - cache_ptr); + result = H5C_flush_to_min_clean(f, dxpl_id, H5AC_noblock_dxpl_id); aux_ptr->write_permitted = FALSE; @@ -4441,7 +4406,7 @@ H5AC_receive_and_apply_clean_list(H5F_t * f, HDassert( cache_ptr != NULL ); HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); - aux_ptr = cache_ptr->aux_ptr; + aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr); HDassert( aux_ptr != NULL ); HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); @@ -4517,8 +4482,7 @@ H5AC_receive_and_apply_clean_list(H5F_t * f, /* mark the indicated entries as clean */ if ( H5C_mark_entries_as_clean(f, primary_dxpl_id, secondary_dxpl_id, - cache_ptr, (int32_t)num_entries, - &(haddr_buf_ptr[0])) < 0 ) { + (int32_t)num_entries, &(haddr_buf_ptr[0])) < 0 ) { HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ "Can't mark entries clean.") |