Linux 3.8 compat: Support CONFIG_UIDGID_STRICT_TYPE_CHECKS
[zfs.git] / module / zfs / zpl_inode.c
index 0f6f3a4..ab1fe68 100644 (file)
@@ -41,6 +41,9 @@ zpl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
        struct inode *ip;
        int error;
 
+       if (dlen(dentry) > ZFS_MAXNAMELEN)
+               return ERR_PTR(-ENAMETOOLONG);
+
        crhold(cr);
        error = -zfs_lookup(dir, dname(dentry), &ip, 0, cr, NULL, NULL);
        ASSERT3S(error, <=, 0);
@@ -71,7 +74,7 @@ zpl_vap_init(vattr_t *vap, struct inode *dir, zpl_umode_t mode, cred_t *cr)
        vap->va_uid = crgetfsuid(cr);
 
        if (dir && dir->i_mode & S_ISGID) {
-               vap->va_gid = dir->i_gid;
+               vap->va_gid = KGID_TO_SGID(dir->i_gid);
                if (S_ISDIR(mode))
                        vap->va_mode |= S_ISGID;
        } else {
@@ -232,8 +235,8 @@ zpl_setattr(struct dentry *dentry, struct iattr *ia)
        vap = kmem_zalloc(sizeof(vattr_t), KM_SLEEP);
        vap->va_mask = ia->ia_valid & ATTR_IATTR_MASK;
        vap->va_mode = ia->ia_mode;
-       vap->va_uid = ia->ia_uid;
-       vap->va_gid = ia->ia_gid;
+       vap->va_uid = KUID_TO_SUID(ia->ia_uid);
+       vap->va_gid = KGID_TO_SGID(ia->ia_gid);
        vap->va_size = ia->ia_size;
        vap->va_atime = ia->ia_atime;
        vap->va_mtime = ia->ia_mtime;
@@ -396,7 +399,7 @@ static int
 #ifdef HAVE_D_REVALIDATE_NAMEIDATA
 zpl_revalidate(struct dentry *dentry, struct nameidata *nd)
 {
-       unsigned int flags = nd->flags;
+       unsigned int flags = (nd ? nd->flags : 0);
 #else
 zpl_revalidate(struct dentry *dentry, unsigned int flags)
 {