Linux 3.8 compat: Support CONFIG_UIDGID_STRICT_TYPE_CHECKS
[zfs.git] / module / zfs / zpl_inode.c
index 15ee0f6..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);
@@ -48,6 +51,9 @@ zpl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
 
        spin_lock(&dentry->d_lock);
        dentry->d_time = jiffies;
+#ifndef HAVE_S_D_OP
+       d_set_d_op(dentry, &zpl_dentry_operations);
+#endif /* HAVE_S_D_OP */
        spin_unlock(&dentry->d_lock);
 
        if (error) {
@@ -68,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 {
@@ -99,7 +105,6 @@ zpl_create(struct inode *dir, struct dentry *dentry, zpl_umode_t mode,
                error = zpl_xattr_security_init(ip, dir, &dentry->d_name);
                VERIFY3S(error, ==, 0);
                d_instantiate(dentry, ip);
-               d_set_d_op(dentry, &zpl_dentry_operations);
        }
 
        kmem_free(vap, sizeof(vattr_t));
@@ -131,10 +136,8 @@ zpl_mknod(struct inode *dir, struct dentry *dentry, zpl_umode_t mode,
        vap->va_rdev = rdev;
 
        error = -zfs_create(dir, dname(dentry), vap, 0, mode, &ip, cr, 0, NULL);
-       if (error == 0) {
+       if (error == 0)
                d_instantiate(dentry, ip);
-               d_set_d_op(dentry, &zpl_dentry_operations);
-       }
 
        kmem_free(vap, sizeof(vattr_t));
        crfree(cr);
@@ -170,10 +173,8 @@ zpl_mkdir(struct inode *dir, struct dentry *dentry, zpl_umode_t mode)
        zpl_vap_init(vap, dir, mode | S_IFDIR, cr);
 
        error = -zfs_mkdir(dir, dname(dentry), vap, &ip, cr, 0, NULL);
-       if (error == 0) {
+       if (error == 0)
                d_instantiate(dentry, ip);
-               d_set_d_op(dentry, &zpl_dentry_operations);
-       }
 
        kmem_free(vap, sizeof(vattr_t));
        crfree(cr);
@@ -234,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;
@@ -278,10 +279,8 @@ zpl_symlink(struct inode *dir, struct dentry *dentry, const char *name)
        zpl_vap_init(vap, dir, S_IFLNK | S_IRWXUGO, cr);
 
        error = -zfs_symlink(dir, dname(dentry), vap, (char *)name, &ip, cr, 0);
-       if (error == 0) {
+       if (error == 0)
                d_instantiate(dentry, ip);
-               d_set_d_op(dentry, &zpl_dentry_operations);
-       }
 
        kmem_free(vap, sizeof(vattr_t));
        crfree(cr);
@@ -352,7 +351,6 @@ zpl_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
        }
 
        d_instantiate(dentry, ip);
-       d_set_d_op(dentry, &zpl_dentry_operations);
 out:
        crfree(cr);
        ASSERT3S(error, <=, 0);
@@ -401,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)
 {