[Devel,RHEL7,COMMIT] fuse: cleanup struct fuse_fill_data

Submitted by Konstantin Khorenko on Jan. 17, 2017, 12:10 p.m.

Details

Message ID 201701171210.v0HCAvAP014189@finist_cl7.x64_64.work.ct
State New
Series "fuse: some cleanup and fix FUSE_NOTIFY_INVAL_FILES deadlock"
Headers show

Commit Message

Konstantin Khorenko Jan. 17, 2017, 12:10 p.m.
The commit is pushed to "branch-rh7-3.10.0-514.vz7.27.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-514.vz7.27.12
------>
commit 7c68b1fedd39c1b84ec052d71644545e7c752696
Author: Maxim Patlasov <mpatlasov@virtuozzo.com>
Date:   Tue Jan 17 16:10:56 2017 +0400

    fuse: cleanup struct fuse_fill_data
    
    fuse_fill_data.ff is redundant: both fuse_send_writepages and
    fuse_writepages use it as a local storage only. Let make it clear
    converting fuse_fill_data.ff to a local variable on stack.
    
    Signed-off-by: Maxim Patlasov <mpatlasov@virtuozzo.com>
---
 fs/fuse/file.c | 46 ++++++++++++++++++----------------------------
 1 file changed, 18 insertions(+), 28 deletions(-)

Patch hide | download patch | download mbox

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 0a4ca51..58313a1 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1162,10 +1162,7 @@  static void fuse_send_readpages(struct fuse_req *req, struct file *file)
 
 struct fuse_fill_data {
 	struct fuse_req *req;
-	union {
-		struct file *file;
-		struct fuse_file *ff;
-	};
+	struct file *file;
 	struct inode *inode;
 	unsigned nr_pages;
 };
@@ -2045,28 +2042,27 @@  static int fuse_send_writepages(struct fuse_fill_data *data)
 	struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info;
 	struct fuse_conn *fc = get_fuse_conn(inode);
 	struct fuse_inode *fi = get_fuse_inode(inode);
+	struct fuse_file *ff;
 	loff_t off = -1;
 
 	/* we can acquire ff here because we do have locked pages here! */
-	if (!data->ff)
-		data->ff = fuse_write_file(fc, fi);
+	ff = fuse_write_file(fc, fi);
 
-	if (!data->ff) {
+	if (!ff) {
 		printk("FUSE: pages dirtied on dead file\n");
 		for (i = 0; i < req->num_pages; i++)
 			end_page_writeback(req->pages[i]);
 		return -EIO;
 	}
 
-	if (test_bit(FUSE_S_FAIL_IMMEDIATELY, &data->ff->ff_state)) {
+	if (test_bit(FUSE_S_FAIL_IMMEDIATELY, &ff->ff_state)) {
 		for (i = 0; i < req->num_pages; i++) {
 			struct page *page = req->pages[i];
 			req->pages[i] = NULL;
 			SetPageError(page);
 			end_page_writeback(page);
 		}
-		fuse_release_ff(inode, data->ff);
-		data->ff = NULL;
+		fuse_release_ff(inode, ff);
 		fuse_put_request(fc, req);
 		return 0;
 	}
@@ -2112,13 +2108,12 @@  static int fuse_send_writepages(struct fuse_fill_data *data)
 		wake_up(&fi->page_waitq);
 		spin_unlock(&fc->lock);
 
-		fuse_release_ff(inode, data->ff);
-		data->ff = NULL;
+		fuse_release_ff(inode, ff);
 		return -ENOMEM;
 	}
 
-	req->ff = fuse_file_get(data->ff);
-	fuse_write_fill(req, data->ff, off, 0);
+	req->ff = fuse_file_get(ff);
+	fuse_write_fill(req, ff, off, 0);
 	fuse_account_request(fc, req->num_pages << PAGE_CACHE_SHIFT);
 
 	req->misc.write.in.write_flags |= FUSE_WRITE_CACHE;
@@ -2132,8 +2127,7 @@  static int fuse_send_writepages(struct fuse_fill_data *data)
 	fuse_flush_writepages(data->inode);
 	spin_unlock(&fc->lock);
 
-	fuse_release_ff(inode, data->ff);
-	data->ff = NULL;
+	fuse_release_ff(inode, ff);
 	return 0;
 }
 
@@ -2230,6 +2224,7 @@  static int fuse_writepages(struct address_space *mapping,
 	struct inode *inode = mapping->host;
 	struct fuse_conn *fc = get_fuse_conn(inode);
 	struct fuse_fill_data data;
+	struct fuse_file *ff;
 	int err;
 
 	if (!fc->writeback_cache)
@@ -2255,24 +2250,21 @@  static int fuse_writepages(struct address_space *mapping,
 	 * fuse_writepages_fill() would possibly deadlock on
 	 * fuse_page_is_writeback().
 	 */
- 	data.ff = fuse_write_file(fc, get_fuse_inode(inode));
-	if (data.ff && test_bit(FUSE_S_FAIL_IMMEDIATELY, &data.ff->ff_state)) {
+	ff = fuse_write_file(fc, get_fuse_inode(inode));
+	if (ff && test_bit(FUSE_S_FAIL_IMMEDIATELY, &ff->ff_state)) {
 		err = write_cache_pages(mapping, wbc, fuse_dummy_writepage,
 					mapping);
-		fuse_release_ff(inode, data.ff);
-		data.ff = NULL;
-		goto out_put;
-	}
-	if (data.ff) {
-		fuse_release_ff(inode, data.ff);
-		data.ff = NULL;
+		fuse_release_ff(inode, ff);
+		goto out;
 	}
+	if (ff)
+		fuse_release_ff(inode, ff);
 
 	data.inode = inode;
 	data.req = fuse_request_alloc_nofs(FUSE_MAX_PAGES_PER_REQ);
 	err = -ENOMEM;
 	if (!data.req)
-		goto out_put;
+		goto out;
 
 	err = write_cache_pages(mapping, wbc, fuse_writepages_fill, &data);
 	if (data.req) {
@@ -2283,8 +2275,6 @@  static int fuse_writepages(struct address_space *mapping,
 		} else
 			fuse_put_request(fc, data.req);
 	}
-out_put:
-	BUG_ON(data.ff);
 out:
 	return err;
 }