Index: django/core/files/storage.py
===================================================================
--- django/core/files/storage.py	(revision 10680)
+++ django/core/files/storage.py	(working copy)
@@ -63,15 +63,18 @@
         Returns a filename that's free on the target storage system, and
         available for new content to be written to.
         """
+
+        dir_name, file_name = os.path.split(name)
         # If the filename already exists, keep adding an underscore to the name
         # of the file until the filename doesn't exist.
         while self.exists(name):
             try:
-                dot_index = name.rindex('.')
+                dot_index = file_name.rindex('.')
             except ValueError: # filename has no dot
-                name += '_'
+                file_name += '_'
             else:
-                name = name[:dot_index] + '_' + name[dot_index:]
+                file_name = file_name[:dot_index] + '_' + file_name[dot_index:]
+            name = os.path.join(dir_name, file_name)
         return name
 
     def path(self, name):
Index: tests/regressiontests/file_storage/tests.py
===================================================================
--- tests/regressiontests/file_storage/tests.py	(revision 10680)
+++ tests/regressiontests/file_storage/tests.py	(working copy)
@@ -141,3 +141,21 @@
         actual_mode = os.stat(self.storage.path(name))[0] & 0777
         self.assertEqual(actual_mode, 0666)
 
+
+class FileStorageDirectoryNameParsing(TestCase):
+    """Regression test for #9610: Using a dotted pathname would mangle
+    the directory name instead of the filename if the file already
+    existed."""
+    def setUp(self):
+        self.storage_dir = tempfile.mkdtemp()
+        self.storage = FileSystemStorage(self.storage_dir)
+
+    def tearDown(self):
+        shutil.rmtree(self.storage_dir)
+
+    def test_directory_name_parsing(self):
+        self.storage.save('dotted.path/test', ContentFile("1"))
+        self.storage.save('dotted.path/test', ContentFile("2"))
+
+        self.assertFalse(os.path.exists(os.path.join(self.storage_dir, 'dotted_.path')))
+        self.assertTrue(os.path.exists(os.path.join(self.storage_dir, 'dotted.path/test_')))
