ceph: return error for traceless reply race
authorYan, Zheng <zyan@redhat.com>
Wed, 4 Feb 2015 07:10:48 +0000 (15:10 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 19 Feb 2015 10:31:40 +0000 (13:31 +0300)
commit4d41cef279f72f3965140fffa6b48f2a7d51408c
treea1f4d52a98108b57002941a47965320c712428f4
parent5cba372c0fe78d24e83d9e0556ecbeb219625c15
ceph: return error for traceless reply race

When we receives traceless reply for request that created new inode,
we re-send a lookup request to MDS get information of the newly created
inode. (VFS expects FS' callback return an inode in create case)
This breaks one request into two requests. Other client may modify or
move to the new inode in the middle.

When the race happens, ceph_handle_notrace_create() unconditionally
links the dentry for 'create' operation to the inode returned by lookup.
This may confuse VFS when the inode is a directory (VFS does not allow
multiple linkages for directory inode).

This patch makes ceph_handle_notrace_create() when it detect a race.
This event should be rare and it happens only when we talk to old MDS.
Recent MDS does not send traceless reply for request that creates new
inode.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
fs/ceph/dir.c