diff -NurpP --minimal linux-2.6.17.11-vs2.1.1-rc31/fs/quota.c linux-2.6.17.11-vs2.1.1-rc31.1/fs/quota.c --- linux-2.6.17.11-vs2.1.1-rc31/fs/quota.c 2006-08-25 21:19:45 +0200 +++ linux-2.6.17.11-vs2.1.1-rc31.1/fs/quota.c 2006-08-26 03:25:11 +0200 @@ -420,7 +420,7 @@ static int do_quotactl(struct dqhash *ha #include #include -static vroot_grb_func *vroot_get_real_bdev = NULL; +vroot_grb_func *vroot_get_real_bdev = NULL; static spinlock_t vroot_grb_lock = SPIN_LOCK_UNLOCKED; diff -NurpP --minimal linux-2.6.17.11-vs2.1.1-rc31/fs/stat.c linux-2.6.17.11-vs2.1.1-rc31.1/fs/stat.c --- linux-2.6.17.11-vs2.1.1-rc31/fs/stat.c 2006-07-09 17:06:57 +0200 +++ linux-2.6.17.11-vs2.1.1-rc31.1/fs/stat.c 2006-08-26 04:21:30 +0200 @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include @@ -35,6 +37,21 @@ void generic_fillattr(struct inode *inod stat->size = i_size_read(inode); stat->blocks = inode->i_blocks; stat->blksize = inode->i_blksize; + + if ((MAJOR(inode->i_rdev) == VROOT_MAJOR) && !vx_check(0, VX_ADMIN)) { + struct block_device *bdev = bdget(inode->i_rdev); + + if (bdev) { + struct block_device *bdnew = vroot_get_real_bdev(bdev); + + if (bdnew && !IS_ERR(bdnew)) { + printk("··· vroot mapping: %p -> %p\n", bdev, bdnew); + stat->rdev = bdnew->bd_inode->i_rdev; + bdput(bdnew); + } + bdput(bdev); + } + } } EXPORT_SYMBOL(generic_fillattr); diff -NurpP --minimal linux-2.6.17.11-vs2.1.1-rc31/include/linux/vroot.h linux-2.6.17.11-vs2.1.1-rc31.1/include/linux/vroot.h --- linux-2.6.17.11-vs2.1.1-rc31/include/linux/vroot.h 2006-07-09 17:07:13 +0200 +++ linux-2.6.17.11-vs2.1.1-rc31.1/include/linux/vroot.h 2006-08-26 03:57:18 +0200 @@ -34,6 +34,8 @@ struct vroot_device { typedef struct block_device *(vroot_grb_func)(struct block_device *); +extern vroot_grb_func *vroot_get_real_bdev; + extern int register_vroot_grb(vroot_grb_func *); extern int unregister_vroot_grb(vroot_grb_func *);