summaryrefslogtreecommitdiff
path: root/pgfuse.c
diff options
context:
space:
mode:
authorAndreas Baumann <abaumann@yahoo.com>2013-04-15 18:52:51 +0200
committerAndreas Baumann <abaumann@yahoo.com>2013-04-15 18:52:51 +0200
commit906665d02eefdc98b93edab645e8f0c08c5dfdf3 (patch)
tree0256d5dee7a609da5f179c772cb78a8258663d61 /pgfuse.c
parent75d12c2bd82cccec8847703e95ceec4fef9588f2 (diff)
downloadpgfuse-906665d02eefdc98b93edab645e8f0c08c5dfdf3.tar.gz
pgfuse-906665d02eefdc98b93edab645e8f0c08c5dfdf3.tar.bz2
started to rewrite, removed dependecy on shell/Perl
resulting a fictive number for free files and free blocks for now added test cases removed function.sql
Diffstat (limited to 'pgfuse.c')
-rw-r--r--pgfuse.c89
1 files changed, 54 insertions, 35 deletions
diff --git a/pgfuse.c b/pgfuse.c
index 1f7a391..7af2d18 100644
--- a/pgfuse.c
+++ b/pgfuse.c
@@ -938,61 +938,80 @@ static int pgfuse_statfs( const char *path, struct statvfs *buf )
PGconn *conn;
- int64_t fs_size, fs_used, fs_free, fs_avail;
+ int64_t blocks_total, blocks_used, blocks_free, blocks_avail;
+ int64_t files_total, files_used, files_free, files_avail;
if( data->verbose ) {
syslog( LOG_INFO, "Statfs called on '%s', thread #%u",
data->mountpoint, THREAD_ID );
}
-
- /* Note: f_frsize, f_favail, f_fsid and f_flag are currently ignored by FUSE */
-
+
memset( buf, 0, sizeof( struct statvfs ) );
- 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;
+ /* blocks */
+
+ blocks_free = psql_get_fs_blocks_free( conn );
+ if( blocks_free < 0 ) {
+ PSQL_ROLLBACK( conn ); RELEASE( conn );
+ return -blocks_free;
+ }
- };
+ blocks_used = psql_get_fs_blocks_used( conn );
+ if( blocks_used < 0 ) {
+ PSQL_ROLLBACK( conn ); RELEASE( conn );
+ return -blocks_used;
+ }
+
+ blocks_total = blocks_free + blocks_used;
+ blocks_avail = blocks_free;
+
+ /* inodes */
- fs_used = psql_get_fs_used( conn );
+ files_free = psql_get_fs_blocks_free( conn );
+ if( files_free < 0 ) {
+ PSQL_ROLLBACK( conn ); RELEASE( conn );
+ return -files_free;
+ }
- if( fs_used < 0 ) {
+ files_used = psql_get_fs_files_used( conn );
+ if( files_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;
- };
+ return -files_used;
+ }
- PSQL_COMMIT( conn ); RELEASE( conn );
+ files_total = files_free + files_used;
+ files_avail = files_free;
- /* Note: it's hard to tell how much space is left in the database
- * and how big it is
- */
- 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;
+ if( data->verbose ) {
+ syslog( LOG_ERR, "Stats for '%s' are (%jd blocks total, %jd used, %jd free, "
+ "%jd files total, %jd files used, %jd files free, thread #%u",
+ data->mountpoint,
+ blocks_total, blocks_used, blocks_free,
+ files_total, files_used, files_free,
+ THREAD_ID );
+ }
+
+ /* fill statfs structure */
+
+ /* Note: f_frsize, f_favail, f_fsid and f_flag are currently ignored by FUSE */
+ buf->f_bsize = data->block_size;
+ buf->f_frsize = data->block_size;
+ buf->f_blocks = blocks_total;
+ buf->f_bfree = blocks_free;
+ buf->f_bavail = blocks_avail;
+ buf->f_files = files_total;
+ buf->f_ffree = files_free;
+ buf->f_favail = files_avail;
+ buf->f_fsid = 0x4FE3A364;
if( data->read_only ) {
buf->f_flag |= ST_RDONLY;
}
buf->f_namemax = MAX_FILENAME_LENGTH;
+
+ PSQL_COMMIT( conn ); RELEASE( conn );
return 0;
}