Fixing the ‘btrfs block device size is smaller than total_bytes in device item’ Error

Recently, I ran into a problem with an old SSD formatted with btrfs. The filesystem refused to mount. Checking dmesg I had an error stating that "the device total_bytes should be at most NUMBER1 but found NUBMER2", where NUMBER1 is less than NUMBER2.

The solution is to use the relatively new fix-device-size feature in btrfs rescue. This was added sometime after 2022, likely in Linux 6.3 (the patch to add this feature was submitted in the kernel developer mailing list in mid-2022). At the moment, I can confirm that 6.4.13 has this feature. Syntax wise, the command is:

btrfs rescue fix-device-size <device>

Just replace <device> with the /dev/ path to the device you are having issues mounting due to the size missmatch. This should work for most cases where the total_bytes for the device is only ‘slightly’ larger than the actual device size.

-John Havlik

Customizing the Separator Based on Position Within Breadcrumb Trail

With Breadcrumb NavXT 7.0, updates to the internals of the plugin added support for more than a single dimension for the breadcrumb trail, allowing portions of the plugin to be cleaned up. As a consequence, non-hierarchical terms now are separated by an actual separator that is controllable. While this separator was not exposed in the settings page, Breadcrumb NavXT 7.2 introduced the bcn_display_separator filter which allows us to control the breadcrumb separator.

The combination of these two features allows new breadcrumb trails that were only possible with lists and CSS in the past. Which, while a valid method, can be a little clunky.

An Example

Suppose the site design requires changing the last separator for non-hierarchical terms (e.g. tags) from the default , to & resulting in a breadcrumb trail for an example post to look like:

Home > Blog > Tag 1, Tag 2 & Tag 3 > Awesome Post

To accomplish this, the bcn_display_separator filter can be used to dynamically replace the separator. Below is an example implementation that does just that:

add_filter('bcn_display_separator', my_bcn_separator, 10, 4);
function my_bcn_separator($separator, $position, $last_position, $depth)
{
    //On the 2nd level and lower, change the last separator to an ampersand
    if($depth > 1 && $position == $last_position - 1)
    {
        return ' &amp; ';
    }
    return $separator;
}

This code will, for any breadcrumb that is beyond the first dimension/level (indicated by $depth) set the separator to & before the final breadcrumb in that dimension/level. Using this code is straightforward, just place it in a site specific plugin (and activate the site specific plugin if it isn’t already active). Naturally, the example code can be modified to use a different separator and to target different positions within the breadcrumb trail, should that be required.

-John Havlik

Using the bcn_manage_options Capability

Since version 6.5.0, Breadcrumb NavXT uses the custom capability bcn_manage_options to grant access to, and allow updating settings on the Breadcrumb NavXT settings page. By default, Breadcrumb NavXT tries to add this capability to the administrator role. However, some setups do not have an administrator role, and require the bcn_manage_options capability to be assigned to the appropriate role on that site.

The following code, when placed in a site specific plugin, adds the bcn_manage_options to the role ROLE:

function my_bcn_manage_options_cap_adder()
{
    $role = get_role('ROLE');
    if($role instanceof \WP_Role && !role->has_cap('bcn_manage_options')
    {
        $role->add_cap('bcn_manage_options');
    }
}
add_action('admin_init', 'my_bcn_manage_options_cap_adder');

Simply swap ROLE for the name of the role that needs access to the Breadcrumb NavXT Settings page.

-John Havlik

Mapping Terms to Posts in Breadcrumb Trails

In certain site configurations, it makes sense to replace the WordPress built-in term archives with a post (an instance of some post type). Typically, a page (instance of the page post type) is used in place of the term archive. Since version 1.5, Breadcrumb NavXT Paths supports mapping terms to pages (with regards to where the breadcrumb links to). To facilitate this, Breadcrumb NavXT Paths provides a metabox in the term editor for establish this mapping.

Sometimes, the page post type does not make sense for this mapping. In that case, the bcn_paths_map_term_post_args can be used to change the post type that the term editor metabox added by Breadcrumb NavXT displays. Note that this filter was introduced in Breadcrumb NavXT Paths 1.6.0.

The Code

Placing the following code into a site specific plugin, will allow Breadcrumb NavXT Paths to map terms to the post post type:

add_filter('bcn_paths_map_term_post_args', 'my_bcn_paths_map_term_post_args', 10, 3);
function my_bcn_paths_map_term_post_args($args, $term, $taxonomy)
{
     $args['post_type'] = 'post';
     return $args;
}

Naturally, this can be modified to specify post types other than post. Should multiple post types be desired, just replace the string 'post' with an array of the post type names. Since this filter affects the arguments sent to get_post, other arguments may be set as well.

-John Havlik