summaryrefslogtreecommitdiff
path: root/pgfuse.c
diff options
context:
space:
mode:
authorAndreas Baumann <abaumann@yahoo.com>2013-04-15 15:27:31 +0200
committerAndreas Baumann <abaumann@yahoo.com>2013-04-15 15:27:31 +0200
commit30b23afb5fca43110f09201897742c378eccb285 (patch)
tree3a584c9e708e5ecd09357fa8415b916a694d33a3 /pgfuse.c
parent8f92530fd96cadff64fabc711c6b523ffb27fe29 (diff)
downloadpgfuse-30b23afb5fca43110f09201897742c378eccb285.tar.gz
pgfuse-30b23afb5fca43110f09201897742c378eccb285.tar.bz2
added statsfs patch from Роман Бородин
Diffstat (limited to 'pgfuse.c')
-rw-r--r--pgfuse.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/pgfuse.c b/pgfuse.c
index 88dbf1e..1f7a391 100644
--- a/pgfuse.c
+++ b/pgfuse.c
@@ -936,6 +936,10 @@ static int pgfuse_statfs( const char *path, struct statvfs *buf )
{
PgFuseData *data = (PgFuseData *)fuse_get_context( )->private_data;
+ PGconn *conn;
+
+ int64_t fs_size, fs_used, fs_free, fs_avail;
+
if( data->verbose ) {
syslog( LOG_INFO, "Statfs called on '%s', thread #%u",
data->mountpoint, THREAD_ID );
@@ -947,12 +951,41 @@ static int pgfuse_statfs( const char *path, struct statvfs *buf )
buf->f_bsize = data->block_size;
buf->f_frsize = data->block_size;
+
+ ACQUIRE( conn );
+ PSQL_BEGIN( conn );
+
+ fs_free = psql_get_fs_free( conn );
+
+ if( fs_free < 0 ) {
+ fs_free = INT_MAX;
+ } else {
+ fs_free = fs_free / data->block_size;
+
+ };
+
+ fs_used = psql_get_fs_used( conn );
+
+ if( fs_used < 0 ) {
+ PSQL_ROLLBACK( conn ); RELEASE( conn );
+ fs_used = INT_MAX;
+ fs_size = INT_MAX;
+ fs_free = INT_MAX;
+ fs_avail = INT_MAX;
+ } else {
+ fs_used = fs_used / data->block_size;
+ fs_size = fs_free + fs_used;
+ fs_avail = fs_free;
+ };
+
+ PSQL_COMMIT( conn ); RELEASE( conn );
+
/* Note: it's hard to tell how much space is left in the database
* and how big it is
*/
- buf->f_blocks = INT_MAX;
- buf->f_bfree = INT_MAX;
- buf->f_bavail = INT_MAX;
+ buf->f_blocks = fs_size;
+ buf->f_bfree = fs_free;
+ buf->f_bavail = fs_avail;
buf->f_files = INT_MAX;
buf->f_ffree = INT_MAX;
buf->f_favail = INT_MAX;