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;
}