HAMMER VFS - Minor bug (caught by assertion panic)
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 18 Oct 2010 07:49:59 +0000 (00:49 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 18 Oct 2010 07:49:59 +0000 (00:49 -0700)
* A snapshot can sometimes contain visible inodes whos nlinks count is 0,
  essentially the snapshot 'catches' the file in the middle of being deleted.

* HAMMER was attempting to truncate the data for such inodes if the file
  were opened and then closed, and failed to check whether the inode was a
  snapshot or a current inode.  This flowed through until it hit an assertion
  designed to detect precisely that case.

* Fixed by adding a check to determine if the inode is a snapshot and/or
  the filesystem is mounted read-only.

Repored-by: Max <herrgard@gmail.com>
sys/vfs/hammer/hammer_inode.c
sys/vfs/hammer/hammer_object.c

index d4784fa..f7212a7 100644 (file)
@@ -3074,9 +3074,11 @@ hammer_inode_unloadable_check(hammer_inode_t ip, int getvp)
         * one that was already flagged.  A previously set DELETING flag
         * may bounce around flags and sync_flags until the operation is
         * completely done.
+        *
+        * Do not attempt to modify a snapshot inode (one set to read-only).
         */
        if (ip->ino_data.nlinks == 0 &&
-           ((ip->flags | ip->sync_flags) & (HAMMER_INODE_DELETING|HAMMER_INODE_DELETED)) == 0) {
+           ((ip->flags | ip->sync_flags) & (HAMMER_INODE_RO|HAMMER_INODE_DELETING|HAMMER_INODE_DELETED)) == 0) {
                ip->flags |= HAMMER_INODE_DELETING;
                ip->flags |= HAMMER_INODE_TRUNCATED;
                ip->trunc_off = 0;
index 00c0dcd..7ccbb88 100644 (file)
@@ -1978,7 +1978,7 @@ retry:
                 * remember the key for a regular file record is (base + len),
                 * NOT (base).
                 *
-                * Note that do to duplicates (mem & media) allowed by
+                * Note that due to duplicates (mem & media) allowed by
                 * DELETE_VISIBILITY, off can wind up less then ran_beg.
                 */
                if (leaf->base.rec_type == HAMMER_RECTYPE_DATA) {