]> git.neil.brown.name Git - LaFS.git/commitdiff
statfs fixes.
authorNeilBrown <neilb@suse.de>
Fri, 4 Mar 2011 01:47:31 +0000 (12:47 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 4 Mar 2011 01:47:31 +0000 (12:47 +1100)
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 <neilb@suse.de>
super.c

diff --git a/super.c b/super.c
index 53ca54272d9b37548b39e637758774ce06c65ef4..7cdde24f84a2f3e486e24f0664316348736299c5 100644 (file)
--- 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;
 }