Louis Rilling 9a73d78cda [PATCH] configfs: Fix failing symlink() making rmdir() fail
On a similar pattern as mkdir() vs rmdir(), a failing symlink() may make rmdir()
fail for the symlink's parent and the symlink's target as well.

failing symlink() making target's rmdir() fail:

	process 1:				process 2:
	symlink("A/S" -> "B")
	  allow_link()
	  create_link()
	    attach to "B" links list
						rmdir("B")
						  detach_prep("B")
						    error because of new link
	    configfs_create_link("A", "S")
	      error (eg -ENOMEM)

failing symlink() making parent's rmdir() fail:

	process 1:				process 2:
	symlink("A/D/S" -> "B")
	  allow_link()
	  create_link()
	    attach to "B" links list
	    configfs_create_link("A/D", "S")
	      make_dirent("A/D", "S")
						rmdir("A")
						  detach_prep("A")
						    detach_prep("A/D")
						      error because of "S"
	      create("S")
	        error (eg -ENOMEM)

We cannot use the same solution as for mkdir() vs rmdir(), since rmdir() on the
target cannot wait on the i_mutex of the new symlink's parent without risking a
deadlock (with other symlink() or sys_rename()). Instead we define a global
mutex protecting all configfs symlinks attachment, so that rmdir() can avoid the
races above.

Signed-off-by: Louis Rilling <louis.rilling@kerlabs.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
2008-07-31 16:21:13 -07:00
..
2008-07-03 09:59:03 -05:00
2008-07-26 20:53:40 -04:00
2008-02-08 09:22:40 -08:00
2008-07-24 10:47:33 -07:00
2008-04-29 08:06:00 -07:00
2008-07-26 20:53:40 -04:00
2008-07-26 20:53:40 -04:00
2008-07-25 10:53:34 -07:00
2008-07-30 09:41:46 -07:00
2008-07-04 09:52:14 +02:00
2008-07-26 12:00:07 -07:00
2008-07-25 10:53:34 -07:00
2008-07-26 20:53:40 -04:00
2008-07-26 12:00:08 -07:00
2008-07-26 12:00:08 -07:00
2008-07-26 12:00:08 -07:00
2008-07-26 12:00:08 -07:00
2008-07-26 12:00:06 -07:00
2008-01-30 13:31:46 +01:00
2008-07-26 12:00:06 -07:00
2008-05-01 13:08:16 -04:00
2008-07-26 20:53:45 -04:00
2008-07-26 20:53:40 -04:00
2008-07-26 20:53:45 -04:00
2008-07-14 19:10:52 +03:00
2008-02-06 10:41:07 -08:00
2008-04-29 08:06:00 -07:00
2008-07-26 12:00:05 -07:00
2008-07-28 18:10:28 +09:00
2008-07-26 12:00:05 -07:00
2008-02-14 21:13:33 -08:00
2008-07-26 20:53:45 -04:00
2008-07-25 10:53:35 -07:00
2008-07-02 15:06:27 -06:00