mirror of
https://gitlab.gnome.org/GNOME/gparted
synced 2024-10-30 09:08:28 +00:00
7fc16a1b69
The btrfs programs only provide approximations of file system sizes because they display figures using binary prefix multipliers to two decimal places of precision. E.g. 2.00GB. For partition sizes where the contained file system size rounds upwards, GParted will fail to read the file system usage and report a warning because the file system will appear to be larger than the partition. For example, create a 2047 MiB partition containing a btrfs file system and display its size. # btrfs filesystem show Label: none uuid: 92535375-5e76-4a70-896a-8d796a577993 Total devices 1 FS bytes used 28.00KB devid 1 size 2.00GB used 240.62MB path /dev/sda12 The file system size appears to be 2048 MiB, but that is larger than the partition, hence the issue GParted has. (Actually uses the btrfs devid size which is the size of the btrfs file system within the partition in question). This issue is new with the fix for Bug #499202 because it queries the file system sizes for the first time. The same issue could theoretically occur previously, but with the used figure (FS bytes used). This would have been virtually impossible to trigger because btrfs file system would have to have been greater than 99% full, but btrfs has been notorious for early reporting of file system full. The fix is that if a btrfs file system size appears larger than the partition size, but the minimum possible size which could have been rounded to the reported figure is within the partition size use the smaller partition size instead. Apply the method to the used figure too, in case the file system is 100% full. Also if the btrfs file system size appears smaller than the partition size, but the maximum possible size which could have been rounded to the reported figure is within the partition size use the larger partition size instead to avoid reporting, presumably false, unallocated space. Not applied to file system used figure. Bug 499202 - gparted does not see the difference if partition size differs from filesystem size
54 lines
2.1 KiB
C++
54 lines
2.1 KiB
C++
/* Copyright (C) 2009,2010 Luca Bruno <lucab@debian.org>
|
|
* Copyright (C) 2010 Curtis Gedak
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
|
|
#ifndef BTRFS_H_
|
|
#define BTRFS_H_
|
|
|
|
#include "../include/FileSystem.h"
|
|
|
|
namespace GParted
|
|
{
|
|
class btrfs : public FileSystem
|
|
{
|
|
public:
|
|
FS get_filesystem_support() ;
|
|
void set_used_sectors( Partition & partition ) ;
|
|
void read_label( Partition & partition ) ;
|
|
bool write_label( const Partition & partition, OperationDetail & operationdetail ) ;
|
|
void read_uuid( Partition & partition ) ;
|
|
bool write_uuid( const Partition & partition, OperationDetail & operationdetail ) ;
|
|
bool create( const Partition & new_partition, OperationDetail & operationdetail ) ;
|
|
bool resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition = false ) ;
|
|
bool move( const Partition & partition_new
|
|
, const Partition & partition_old
|
|
, OperationDetail & operationdetail
|
|
) ;
|
|
bool copy( const Glib::ustring & src_part_path,
|
|
const Glib::ustring & dest_part_path,
|
|
OperationDetail & operationdetail ) ;
|
|
bool check_repair( const Partition & partition, OperationDetail & operationdetail ) ;
|
|
|
|
private:
|
|
Byte_Value btrfs_size_to_num( Glib::ustring str, Byte_Value ptn_bytes, bool scale_up ) const ;
|
|
gdouble btrfs_size_max_delta( Glib::ustring str ) const ;
|
|
gdouble btrfs_size_to_gdouble( Glib::ustring str ) const ;
|
|
};
|
|
} //GParted
|
|
|
|
#endif //BTRFS_H_
|