Account for .zfs ctldir inodes
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 22 Mar 2012 21:47:29 +0000 (14:47 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 22 Mar 2012 22:43:55 +0000 (15:43 -0700)
Because the .zfs ctldir inodes are not backed by physical storage
they use a different create path which was not properly accounting
for them as used.  This could result in ->nr_cached_objects()
returning 0 and cause a divide by zero error in prune_super().

In my option there's a kernel bug here too which allows this to
happen.  They should either be checking for 0 or adding +1 like
they correctly do earlier in the function.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #617

module/zfs/zfs_ctldir.c

index 01bf52f..1923934 100644 (file)
@@ -212,6 +212,7 @@ zfsctl_inode_alloc(zfs_sb_t *zsb, uint64_t id,
 
        mutex_enter(&zsb->z_znodes_lock);
        list_insert_tail(&zsb->z_all_znodes, zp);
+       zsb->z_nr_znodes++;
        membar_producer();
        mutex_exit(&zsb->z_znodes_lock);