cifs: smb1: Try failing back to SetFileInfo if SetPathInfo fails
[sfrench/cifs-2.6.git] / fs / cifs / cifssmb.c
index bf41ee048396d09b5484e41823d5980553d61179..dc62e2620cc8fa0f8d537d5c62a16fbba50ef81a 100644 (file)
@@ -5913,10 +5913,42 @@ CIFSSMBSetFileDisposition(const unsigned int xid, struct cifs_tcon *tcon,
        return rc;
 }
 
+static int
+CIFSSMBSetPathInfoFB(const unsigned int xid, struct cifs_tcon *tcon,
+                    const char *fileName, const FILE_BASIC_INFO *data,
+                    const struct nls_table *nls_codepage,
+                    struct cifs_sb_info *cifs_sb)
+{
+       int oplock = 0;
+       struct cifs_open_parms oparms;
+       struct cifs_fid fid;
+       int rc;
+
+       oparms.tcon = tcon;
+       oparms.cifs_sb = cifs_sb;
+       oparms.desired_access = GENERIC_WRITE;
+       oparms.create_options = cifs_create_options(cifs_sb, 0);
+       oparms.disposition = FILE_OPEN;
+       oparms.path = fileName;
+       oparms.fid = &fid;
+       oparms.reconnect = false;
+
+       rc = CIFS_open(xid, &oparms, &oplock, NULL);
+       if (rc)
+               goto out;
+
+       rc = CIFSSMBSetFileInfo(xid, tcon, data, fid.netfid, current->tgid);
+       CIFSSMBClose(xid, tcon, fid.netfid);
+out:
+
+       return rc;
+}
+
 int
 CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
                   const char *fileName, const FILE_BASIC_INFO *data,
-                  const struct nls_table *nls_codepage, int remap)
+                  const struct nls_table *nls_codepage,
+                    struct cifs_sb_info *cifs_sb)
 {
        TRANSACTION2_SPI_REQ *pSMB = NULL;
        TRANSACTION2_SPI_RSP *pSMBr = NULL;
@@ -5925,6 +5957,7 @@ CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon,
        int bytes_returned = 0;
        char *data_offset;
        __u16 params, param_offset, offset, byte_count, count;
+       int remap = cifs_remap(cifs_sb);
 
        cifs_dbg(FYI, "In SetTimes\n");
 
@@ -5987,6 +6020,10 @@ SetTimesRetry:
        if (rc == -EAGAIN)
                goto SetTimesRetry;
 
+       if (rc == -EOPNOTSUPP)
+               return CIFSSMBSetPathInfoFB(xid, tcon, fileName, data,
+                                           nls_codepage, cifs_sb);
+
        return rc;
 }