Commit ebf84d0c authored by Kirill Tkhai's avatar Kirill Tkhai Committed by Miklos Szeredi

fuse: Add fuse_inode argument to fuse_prepare_release()

Here is preparation for next patches, which introduce new fi->lock for
protection of ff->write_entry linked into fi->write_files.

This patch just passes new argument to the function.
Signed-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent b782911b
...@@ -141,10 +141,11 @@ static int cuse_open(struct inode *inode, struct file *file) ...@@ -141,10 +141,11 @@ static int cuse_open(struct inode *inode, struct file *file)
static int cuse_release(struct inode *inode, struct file *file) static int cuse_release(struct inode *inode, struct file *file)
{ {
struct fuse_inode *fi = get_fuse_inode(inode);
struct fuse_file *ff = file->private_data; struct fuse_file *ff = file->private_data;
struct fuse_conn *fc = ff->fc; struct fuse_conn *fc = ff->fc;
fuse_sync_release(ff, file->f_flags); fuse_sync_release(fi, ff, file->f_flags);
fuse_conn_put(fc); fuse_conn_put(fc);
return 0; return 0;
......
...@@ -400,6 +400,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, ...@@ -400,6 +400,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
struct fuse_create_in inarg; struct fuse_create_in inarg;
struct fuse_open_out outopen; struct fuse_open_out outopen;
struct fuse_entry_out outentry; struct fuse_entry_out outentry;
struct fuse_inode *fi;
struct fuse_file *ff; struct fuse_file *ff;
/* Userspace expects S_IFREG in create mode */ /* Userspace expects S_IFREG in create mode */
...@@ -451,7 +452,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, ...@@ -451,7 +452,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
&outentry.attr, entry_attr_timeout(&outentry), 0); &outentry.attr, entry_attr_timeout(&outentry), 0);
if (!inode) { if (!inode) {
flags &= ~(O_CREAT | O_EXCL | O_TRUNC); flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
fuse_sync_release(ff, flags); fuse_sync_release(NULL, ff, flags);
fuse_queue_forget(fc, forget, outentry.nodeid, 1); fuse_queue_forget(fc, forget, outentry.nodeid, 1);
err = -ENOMEM; err = -ENOMEM;
goto out_err; goto out_err;
...@@ -462,7 +463,8 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, ...@@ -462,7 +463,8 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
fuse_dir_changed(dir); fuse_dir_changed(dir);
err = finish_open(file, entry, generic_file_open); err = finish_open(file, entry, generic_file_open);
if (err) { if (err) {
fuse_sync_release(ff, flags); fi = get_fuse_inode(inode);
fuse_sync_release(fi, ff, flags);
} else { } else {
file->private_data = ff; file->private_data = ff;
fuse_finish_open(inode, file); fuse_finish_open(inode, file);
......
...@@ -224,7 +224,8 @@ int fuse_open_common(struct inode *inode, struct file *file, bool isdir) ...@@ -224,7 +224,8 @@ int fuse_open_common(struct inode *inode, struct file *file, bool isdir)
return err; return err;
} }
static void fuse_prepare_release(struct fuse_file *ff, int flags, int opcode) static void fuse_prepare_release(struct fuse_inode *fi, struct fuse_file *ff,
int flags, int opcode)
{ {
struct fuse_conn *fc = ff->fc; struct fuse_conn *fc = ff->fc;
struct fuse_req *req = ff->reserved_req; struct fuse_req *req = ff->reserved_req;
...@@ -249,11 +250,12 @@ static void fuse_prepare_release(struct fuse_file *ff, int flags, int opcode) ...@@ -249,11 +250,12 @@ static void fuse_prepare_release(struct fuse_file *ff, int flags, int opcode)
void fuse_release_common(struct file *file, bool isdir) void fuse_release_common(struct file *file, bool isdir)
{ {
struct fuse_inode *fi = get_fuse_inode(file_inode(file));
struct fuse_file *ff = file->private_data; struct fuse_file *ff = file->private_data;
struct fuse_req *req = ff->reserved_req; struct fuse_req *req = ff->reserved_req;
int opcode = isdir ? FUSE_RELEASEDIR : FUSE_RELEASE; int opcode = isdir ? FUSE_RELEASEDIR : FUSE_RELEASE;
fuse_prepare_release(ff, file->f_flags, opcode); fuse_prepare_release(fi, ff, file->f_flags, opcode);
if (ff->flock) { if (ff->flock) {
struct fuse_release_in *inarg = &req->misc.release.in; struct fuse_release_in *inarg = &req->misc.release.in;
...@@ -295,10 +297,10 @@ static int fuse_release(struct inode *inode, struct file *file) ...@@ -295,10 +297,10 @@ static int fuse_release(struct inode *inode, struct file *file)
return 0; return 0;
} }
void fuse_sync_release(struct fuse_file *ff, int flags) void fuse_sync_release(struct fuse_inode *fi, struct fuse_file *ff, int flags)
{ {
WARN_ON(refcount_read(&ff->count) > 1); WARN_ON(refcount_read(&ff->count) > 1);
fuse_prepare_release(ff, flags, FUSE_RELEASE); fuse_prepare_release(fi, ff, flags, FUSE_RELEASE);
/* /*
* iput(NULL) is a no-op and since the refcount is 1 and everything's * iput(NULL) is a no-op and since the refcount is 1 and everything's
* synchronous, we are fine with not doing igrab() here" * synchronous, we are fine with not doing igrab() here"
......
...@@ -817,7 +817,7 @@ struct fuse_file *fuse_file_alloc(struct fuse_conn *fc); ...@@ -817,7 +817,7 @@ struct fuse_file *fuse_file_alloc(struct fuse_conn *fc);
void fuse_file_free(struct fuse_file *ff); void fuse_file_free(struct fuse_file *ff);
void fuse_finish_open(struct inode *inode, struct file *file); void fuse_finish_open(struct inode *inode, struct file *file);
void fuse_sync_release(struct fuse_file *ff, int flags); void fuse_sync_release(struct fuse_inode *fi, struct fuse_file *ff, int flags);
/** /**
* Send RELEASE or RELEASEDIR request * Send RELEASE or RELEASEDIR request
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment