goto out_inserted_sd;
        }
 
+       /*
+        * Mark it private if we're creating the privroot
+        * or something under it.
+        */
+       if (IS_PRIVATE(dir) || dentry == REISERFS_SB(sb)->priv_root) {
+               inode->i_flags |= S_PRIVATE;
+               inode->i_opflags &= ~IOP_XATTR;
+       }
+
        if (reiserfs_posixacl(inode->i_sb)) {
                reiserfs_write_unlock(inode->i_sb);
                retval = reiserfs_inherit_default_acl(th, dir, dentry, inode);
                reiserfs_warning(inode->i_sb, "jdm-13090",
                                 "ACLs aren't enabled in the fs, "
                                 "but vfs thinks they are!");
-       } else if (IS_PRIVATE(dir))
-               inode->i_flags |= S_PRIVATE;
+       }
 
        if (security->name) {
                reiserfs_write_unlock(inode->i_sb);
 
        struct dentry *xaroot;
 
        if (d_really_is_negative(privroot))
-               return ERR_PTR(-ENODATA);
+               return ERR_PTR(-EOPNOTSUPP);
 
        inode_lock_nested(d_inode(privroot), I_MUTEX_XATTR);
 
        xaroot = dget(REISERFS_SB(sb)->xattr_root);
        if (!xaroot)
-               xaroot = ERR_PTR(-ENODATA);
+               xaroot = ERR_PTR(-EOPNOTSUPP);
        else if (d_really_is_negative(xaroot)) {
                int err = -ENODATA;
 
        int error, error2;
        size_t jbegin_count = reiserfs_xattr_nblocks(inode, buffer_size);
 
+       /* Check before we start a transaction and then do nothing. */
+       if (!d_really_is_positive(REISERFS_SB(inode->i_sb)->priv_root))
+               return -EOPNOTSUPP;
+
        if (!(flags & XATTR_REPLACE))
                jbegin_count += reiserfs_xattr_jcreate_nblocks(inode);
 
        if (d_really_is_negative(dentry))
                return -EINVAL;
 
-       if (!dentry->d_sb->s_xattr ||
-           get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1)
+       if (get_inode_sd_version(d_inode(dentry)) == STAT_DATA_V1)
                return -EOPNOTSUPP;
 
        dir = open_xa_dir(d_inode(dentry), XATTR_REPLACE);
        }
 
        d_inode(dentry)->i_flags |= S_PRIVATE;
+       d_inode(dentry)->i_opflags &= ~IOP_XATTR;
        reiserfs_info(dentry->d_sb, "Created %s - reserved for xattr "
                      "storage.\n", PRIVROOT_NAME);
 
 #endif
 
 /* Actual operations that are exported to VFS-land */
-static const struct xattr_handler *reiserfs_xattr_handlers[] = {
+const struct xattr_handler *reiserfs_xattr_handlers[] = {
 #ifdef CONFIG_REISERFS_FS_XATTR
        &reiserfs_xattr_user_handler,
        &reiserfs_xattr_trusted_handler,
        if (!IS_ERR(dentry)) {
                REISERFS_SB(s)->priv_root = dentry;
                d_set_d_op(dentry, &xattr_lookup_poison_ops);
-               if (d_really_is_positive(dentry))
+               if (d_really_is_positive(dentry)) {
                        d_inode(dentry)->i_flags |= S_PRIVATE;
+                       d_inode(dentry)->i_opflags &= ~IOP_XATTR;
+               }
        } else
                err = PTR_ERR(dentry);
        inode_unlock(d_inode(s->s_root));
        }
 
        if (d_really_is_positive(privroot)) {
-               s->s_xattr = reiserfs_xattr_handlers;
                inode_lock(d_inode(privroot));
                if (!REISERFS_SB(s)->xattr_root) {
                        struct dentry *dentry;