Skip to content

Commit

Permalink
9p: fix EBADF errors in cached mode
Browse files Browse the repository at this point in the history
cached operations sometimes need to do invalid operations (e.g. read
on a write only file)
Historic fscache had added a "writeback fid" for this, but the conversion
to new fscache somehow lost usage of it: use the writeback fid instead
of normal one.

Note that the way this works (writeback fid being linked to inode) means
we might use overprivileged fid for some operations, e.g. write as root
when we shouldn't.
Ideally we should keep both fids handy, and only use the writeback fid
when really required e.g. reads to a write-only file to fill in the page
cache (read-modify-write); but this is the situation we've always had
and this commit only fixes an issue we've had for too long.

Fixes: eb49794 ("9p: Convert to using the netfs helper lib to do reads and caching")
[unfortunately won't apply cleanly due to netfs name changes]
Cc: stable@vger.kernel.org
Cc: David Howells <dhowells@redhat.com>
Reported-By: Christian Schoenebeck <linux_oss@crudebyte.com>
Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
  • Loading branch information
martinetd committed Jun 14, 2022
1 parent 10e09e5 commit a6e033c
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion fs/9p/vfs_addr.c
Expand Up @@ -58,7 +58,17 @@ static void v9fs_issue_read(struct netfs_io_subrequest *subreq)
*/
static int v9fs_init_request(struct netfs_io_request *rreq, struct file *file)
{
struct p9_fid *fid = file->private_data;
struct inode *inode = file_inode(file);
struct v9fs_inode *v9inode = V9FS_I(inode);
struct p9_fid *fid = v9inode->writeback_fid;

/* If there is no writeback fid this file only ever has had
* read-only opens, so we can use file's fid which should
* always be set instead */
if (!fid)
fid = file->private_data;

BUG_ON(!fid);

refcount_inc(&fid->count);
rreq->netfs_priv = fid;
Expand Down

0 comments on commit a6e033c

Please sign in to comment.