{
        struct TCP_Server_Info *server = tcon->ses->server;
        struct cifs_open_parms oparms;
+       struct cifs_open_info_data idata;
        struct cifs_io_parms io_parms = {};
        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
        struct cifs_fid fid;
                             CREATE_OPTION_SPECIAL, ACL_NO_MODE);
        oparms.fid = &fid;
 
-       rc = server->ops->open(xid, &oparms, &oplock, NULL);
+       rc = server->ops->open(xid, &oparms, &oplock, &idata);
        if (rc)
                goto out;
 
+       /*
+        * Check if the server honored ATTR_SYSTEM flag by CREATE_OPTION_SPECIAL
+        * option. If not then server does not support ATTR_SYSTEM and newly
+        * created file is not SFU compatible, which means that the call failed.
+        */
+       if (!(le32_to_cpu(idata.fi.Attributes) & ATTR_SYSTEM)) {
+               rc = -EOPNOTSUPP;
+               goto out_close;
+       }
+
        if (type_len + data_len > 0) {
                io_parms.pid = current->tgid;
                io_parms.tcon = tcon;
                                             iov, ARRAY_SIZE(iov)-1);
        }
 
+out_close:
        server->ops->close(xid, tcon, &fid);
 
+       /*
+        * If CREATE was successful but either setting ATTR_SYSTEM failed or
+        * writing type/data information failed then remove the intermediate
+        * object created by CREATE. Otherwise intermediate empty object stay
+        * on the server.
+        */
+       if (rc)
+               server->ops->unlink(xid, tcon, full_path, cifs_sb, NULL);
+
 out:
        kfree(symname_utf16);
        return rc;