Cleanly support debug packages
[zfs.git] / module / zfs / zfs_vnops.c
index b7f5daa..74b96b8 100644 (file)
@@ -2012,12 +2012,22 @@ zfs_readdir(struct inode *ip, void *dirent, filldir_t filldir,
                                        goto update;
                        }
 
+                       /*
+                        * Allow multiple entries provided the first entry is
+                        * the object id.  Non-zpl consumers may safely make
+                        * use of the additional space.
+                        *
+                        * XXX: This should be a feature flag for compatibility
+                        */
                        if (zap.za_integer_length != 8 ||
-                           zap.za_num_integers != 1) {
+                           zap.za_num_integers == 0) {
                                cmn_err(CE_WARN, "zap_readdir: bad directory "
-                                   "entry, obj = %lld, offset = %lld\n",
+                                   "entry, obj = %lld, offset = %lld, "
+                                   "length = %d, num = %lld\n",
                                    (u_longlong_t)zp->z_id,
-                                   (u_longlong_t)*pos);
+                                   (u_longlong_t)*pos,
+                                   zap.za_integer_length,
+                                   (u_longlong_t)zap.za_num_integers);
                                error = ENXIO;
                                goto update;
                        }
@@ -4145,6 +4155,17 @@ zfs_space(struct inode *ip, int cmd, flock64_t *bfp, int flag,
                return (EINVAL);
        }
 
+       /*
+        * Permissions aren't checked on Solaris because on this OS
+        * zfs_space() can only be called with an opened file handle.
+        * On Linux we can get here through truncate_range() which
+        * operates directly on inodes, so we need to check access rights.
+        */
+       if ((error = zfs_zaccess(zp, ACE_WRITE_DATA, 0, B_FALSE, cr))) {
+               ZFS_EXIT(zsb);
+               return (error);
+       }
+
        off = bfp->l_start;
        len = bfp->l_len; /* 0 means from off to end of file */