From: NeilBrown Date: Fri, 4 Mar 2011 01:47:31 +0000 (+1100) Subject: statfs fixes. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=a35b15b823f61e2fe757b26ee124bd96ca2ca235;p=LaFS.git statfs fixes. 1/ use space for 'this' filesystem, not primary filesystem 2/ include more entropy in fsuid 3/ make different filesets have different fsuid. Signed-off-by: NeilBrown --- diff --git a/super.c b/super.c index 53ca542..7cdde24 100644 --- a/super.c +++ b/super.c @@ -1346,41 +1346,47 @@ static int lafs_statfs(struct dentry *de, struct kstatfs *buf) u32 fsid; u32 *fsuuid; struct fs *fs = fs_from_inode(de->d_inode); - struct lafs_inode *root = LAFSI(fs->ss[0].root); + struct lafs_inode *fsroot = LAFSI(ino_from_sb(de->d_inode->i_sb)); + struct lafs_inode *laroot = LAFSI(fs->ss[0].root); fsid = 0; fsuuid = (u32 *)fs->state->uuid; - for (i = 0; i < 16 / 4 ; i++) + for (i = 0; i < 16 / 4 ; i++) { fsid ^= le32_to_cpu(fsuuid[i]); - - spin_lock(&root->vfs_inode.i_lock); + buf->f_fsid.val[i/2] = fsid; + } + buf->f_fsid.val[1] ^= fsroot->vfs_inode.i_ino; buf->f_type = 0x4C614654; /* "LaFS" */ buf->f_bsize = fs->blocksize; - buf->f_blocks = root->md.fs.blocks_allowed; + buf->f_blocks = fsroot->md.fs.blocks_allowed; if (buf->f_blocks == 0) { /* should subtract usage of all other filesystems...*/ for (i = 0; i < fs->devs_loaded; i++) buf->f_blocks += fs->devs[i].size; } + + buf->f_files = 0; + buf->f_ffree = 0; + buf->f_namelen = 255; + buf->f_frsize = 0; + + spin_lock(&laroot->vfs_inode.i_lock); /* "bavail" is "blocks we could succeed in adding to the filesystem". * "bfree" is effectively total blocks - used blocks */ buf->f_bavail = fs->free_blocks + fs->clean_reserved - fs->allocated_blocks; - buf->f_bfree = buf->f_blocks - (root->md.fs.cblocks_used + - root->md.fs.pblocks_used + - root->md.fs.ablocks_used); + spin_unlock(&laroot->vfs_inode.i_lock); + spin_lock(&fsroot->vfs_inode.i_lock); + buf->f_bfree = buf->f_blocks - (fsroot->md.fs.cblocks_used + + fsroot->md.fs.pblocks_used + + fsroot->md.fs.ablocks_used); dprintk("df: tot=%ld free=%ld avail=%ld(%ld-%ld-%ld) cb=%ld pb=%ld ab=%ld\n", (long)buf->f_blocks, (long)buf->f_bfree, (long)buf->f_bavail, - (long)fs->free_blocks, (long)fs->clean_reserved, (long)fs->allocated_blocks, - (long)root->md.fs.cblocks_used, (long)root->md.fs.pblocks_used, - (long)root->md.fs.ablocks_used); - - buf->f_files = 0; - buf->f_ffree = 0; - buf->f_fsid.val[0] = fsid; /* FIXME */ - buf->f_namelen = 255; - buf->f_frsize = 0; - spin_unlock(&root->vfs_inode.i_lock); + (long)fs->free_blocks, (long)fs->clean_reserved, + (long)fs->allocated_blocks, + (long)fsroot->md.fs.cblocks_used, (long)fsroot->md.fs.pblocks_used, + (long)fsroot->md.fs.ablocks_used); + spin_unlock(&fsroot->vfs_inode.i_lock); return 0; }