From: Brian Behlendorf Date: Thu, 22 Mar 2012 21:47:29 +0000 (-0700) Subject: Account for .zfs ctldir inodes X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=commitdiff_plain;h=9ed86e7cc7d0880c35f675efc2177012f01f5678;p=zfs.git Account for .zfs ctldir inodes 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 Closes #617 --- diff --git a/module/zfs/zfs_ctldir.c b/module/zfs/zfs_ctldir.c index 01bf52f..1923934 100644 --- a/module/zfs/zfs_ctldir.c +++ b/module/zfs/zfs_ctldir.c @@ -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);