return 0;
 }
 
+
+static struct ceph_snap_context *empty_snapc;
+
 /*
  * build the snap context for a given realm.
  */
                return 0;
        }
 
+       if (num == 0 && realm->seq == empty_snapc->seq) {
+               ceph_get_snap_context(empty_snapc);
+               snapc = empty_snapc;
+               goto done;
+       }
+
        /* alloc new snap context */
        err = -ENOMEM;
        if (num > (SIZE_MAX - sizeof(*snapc)) / sizeof(u64))
             realm->ino, realm, snapc, snapc->seq,
             (unsigned int) snapc->num_snaps);
 
+done:
        ceph_put_snap_context(realm->cached_context);
        realm->cached_context = snapc;
        return 0;
                   cap_snap.  lucky us. */
                dout("queue_cap_snap %p already pending\n", inode);
                kfree(capsnap);
+       } else if (ci->i_snap_realm->cached_context == empty_snapc) {
+               dout("queue_cap_snap %p empty snapc\n", inode);
+               kfree(capsnap);
        } else if (dirty & (CEPH_CAP_AUTH_EXCL|CEPH_CAP_XATTR_EXCL|
                            CEPH_CAP_FILE_EXCL|CEPH_CAP_FILE_WR)) {
                struct ceph_snap_context *snapc = ci->i_head_snapc;
        return;
 }
 
+int __init ceph_snap_init(void)
+{
+       empty_snapc = ceph_create_snap_context(0, GFP_NOFS);
+       if (!empty_snapc)
+               return -ENOMEM;
+       empty_snapc->seq = 1;
+       return 0;
+}
 
-
+void ceph_snap_exit(void)
+{
+       ceph_put_snap_context(empty_snapc);
+}
 
 
        ceph_flock_init();
        ceph_xattr_init();
+       ret = ceph_snap_init();
+       if (ret)
+               goto out_xattr;
        ret = register_filesystem(&ceph_fs_type);
        if (ret)
-               goto out_icache;
+               goto out_snap;
 
        pr_info("loaded (mds proto %d)\n", CEPH_MDSC_PROTOCOL);
 
        return 0;
 
-out_icache:
+out_snap:
+       ceph_snap_exit();
+out_xattr:
        ceph_xattr_exit();
        destroy_caches();
 out:
 {
        dout("exit_ceph\n");
        unregister_filesystem(&ceph_fs_type);
+       ceph_snap_exit();
        ceph_xattr_exit();
        destroy_caches();
 }
 
 extern int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
                                  struct ceph_cap_snap *capsnap);
 extern void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc);
+extern int ceph_snap_init(void);
+extern void ceph_snap_exit(void);
 
 /*
  * a cap_snap is "pending" if it is still awaiting an in-progress