fuse: fix LOOKUP vs INIT compat handling
authorMiklos Szeredi <mszeredi@suse.cz>
Tue, 6 Jan 2015 09:45:35 +0000 (10:45 +0100)
committerMiklos Szeredi <mszeredi@suse.cz>
Tue, 6 Jan 2015 09:45:35 +0000 (10:45 +0100)
commit21f621741a770c119e7529a3f5c0e6b7c91383a3
tree4393194807e351d0c2922673d44409a656a87259
parentb1940cd21c0f4abdce101253e860feff547291b0
fuse: fix LOOKUP vs INIT compat handling

Analysis from Marc:

 "Commit 7078187a795f ("fuse: introduce fuse_simple_request() helper")
  from the above pull request triggers some EIO errors for me in some tests
  that rely on fuse

  Looking at the code changes and a bit of debugging info I think there's a
  general problem here that fuse_get_req checks and possibly waits for
  fc->initialized, and this was always called first.  But this commit
  changes the ordering and in many places fc->minor is now possibly used
  before fuse_get_req, and we can't be sure that fc has been initialized.
  In my case fuse_lookup_init sets req->out.args[0].size to the wrong size
  because fc->minor at that point is still 0, leading to the EIO error."

Fix by moving the compat adjustments into fuse_simple_request() to after
fuse_get_req().

This is also more readable than the original, since now compatibility is
handled in a single function instead of cluttering each operation.

Reported-by: Marc Dionne <marc.c.dionne@gmail.com>
Tested-by: Marc Dionne <marc.c.dionne@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Fixes: 7078187a795f ("fuse: introduce fuse_simple_request() helper")
fs/fuse/dev.c
fs/fuse/dir.c
fs/fuse/inode.c
This page took 0.024225 seconds and 5 git commands to generate.