*/
 int __ceph_caps_file_wanted(struct ceph_inode_info *ci)
 {
-       int want = 0;
-       int mode;
-       for (mode = 0; mode < CEPH_FILE_MODE_NUM; mode++)
-               if (ci->i_nr_by_mode[mode])
-                       want |= ceph_caps_for_mode(mode);
-       return want;
+       int i, bits = 0;
+       for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
+               if (ci->i_nr_by_mode[i])
+                       bits |= 1 << i;
+       }
+       if (bits == 0)
+               return 0;
+       return ceph_caps_for_mode(bits >> 1);
 }
 
 /*
        dout("flush_dirty_caps done\n");
 }
 
+void __ceph_get_fmode(struct ceph_inode_info *ci, int fmode)
+{
+       int i;
+       int bits = (fmode << 1) | 1;
+       for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
+               if (bits & (1 << i))
+                       ci->i_nr_by_mode[i]++;
+       }
+}
+
 /*
  * Drop open file reference.  If we were the last open file,
  * we may need to release capabilities to the MDS (or schedule
  */
 void ceph_put_fmode(struct ceph_inode_info *ci, int fmode)
 {
-       struct inode *inode = &ci->vfs_inode;
-       int last = 0;
-
+       int i, last = 0;
+       int bits = (fmode << 1) | 1;
        spin_lock(&ci->i_ceph_lock);
-       dout("put_fmode %p fmode %d %d -> %d\n", inode, fmode,
-            ci->i_nr_by_mode[fmode], ci->i_nr_by_mode[fmode]-1);
-       BUG_ON(ci->i_nr_by_mode[fmode] == 0);
-       if (--ci->i_nr_by_mode[fmode] == 0)
-               last++;
+       for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
+               if (bits & (1 << i)) {
+                       BUG_ON(ci->i_nr_by_mode[i] == 0);
+                       if (--ci->i_nr_by_mode[i] == 0)
+                               last++;
+               }
+       }
+       dout("put_fmode %p fmode %d {%d,%d,%d,%d}\n",
+            &ci->vfs_inode, fmode,
+            ci->i_nr_by_mode[0], ci->i_nr_by_mode[1],
+            ci->i_nr_by_mode[2], ci->i_nr_by_mode[3]);
        spin_unlock(&ci->i_ceph_lock);
 
        if (last && ci->i_vino.snap == CEPH_NOSNAP)
 
 
        if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) {
                spin_lock(&ci->i_ceph_lock);
-               ci->i_nr_by_mode[fi->fmode]--;
                fi->fmode |= CEPH_FILE_MODE_LAZY;
-               ci->i_nr_by_mode[fi->fmode]++;
+               ci->i_nr_by_mode[ffs(CEPH_FILE_MODE_LAZY)]++;
                spin_unlock(&ci->i_ceph_lock);
                dout("ioctl_layzio: file %p marked lazy\n", file);
 
 
                                                    dirty|flushing caps */
        unsigned i_snap_caps;           /* cap bits for snapped files */
 
-       int i_nr_by_mode[CEPH_FILE_MODE_NUM];  /* open file counts */
+       int i_nr_by_mode[CEPH_FILE_MODE_BITS];  /* open file counts */
 
        struct mutex i_truncate_mutex;
        u32 i_truncate_seq;        /* last truncate to smaller size */
                         loff_t endoff, int *got, struct page **pinned_page);
 
 /* for counting open files by mode */
-static inline void __ceph_get_fmode(struct ceph_inode_info *ci, int mode)
-{
-       ci->i_nr_by_mode[mode]++;
-}
+extern void __ceph_get_fmode(struct ceph_inode_info *ci, int mode);
 extern void ceph_put_fmode(struct ceph_inode_info *ci, int mode);
 
 /* addr.c */