diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2013-10-01 10:44:52 -0400 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2013-10-01 10:44:52 -0400 |
commit | 72523425fb434e81c0c9f611bd880ce339c4e06b (patch) | |
tree | 1ef20df324b842a78a2c7e3df6a957424d7ac042 /fs/fuse | |
parent | cca2437045dda994d23bd65891b71e091fa35b5a (diff) |
fuse: don't BUG on no write file
Don't bug if there's no writable files found for page writeback. If ever
this is triggered, a WARN_ON helps debugging it much better then a BUG_ON.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs/fuse')
-rw-r--r-- | fs/fuse/file.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 6fb9425c23c6..6ce0066d7c8c 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -1505,12 +1505,14 @@ static void fuse_writepage_end(struct fuse_conn *fc, struct fuse_req *req) | |||
1505 | static struct fuse_file *fuse_write_file(struct fuse_conn *fc, | 1505 | static struct fuse_file *fuse_write_file(struct fuse_conn *fc, |
1506 | struct fuse_inode *fi) | 1506 | struct fuse_inode *fi) |
1507 | { | 1507 | { |
1508 | struct fuse_file *ff; | 1508 | struct fuse_file *ff = NULL; |
1509 | 1509 | ||
1510 | spin_lock(&fc->lock); | 1510 | spin_lock(&fc->lock); |
1511 | BUG_ON(list_empty(&fi->write_files)); | 1511 | if (!WARN_ON(list_empty(&fi->write_files))) { |
1512 | ff = list_entry(fi->write_files.next, struct fuse_file, write_entry); | 1512 | ff = list_entry(fi->write_files.next, struct fuse_file, |
1513 | fuse_file_get(ff); | 1513 | write_entry); |
1514 | fuse_file_get(ff); | ||
1515 | } | ||
1514 | spin_unlock(&fc->lock); | 1516 | spin_unlock(&fc->lock); |
1515 | 1517 | ||
1516 | return ff; | 1518 | return ff; |
@@ -1524,6 +1526,7 @@ static int fuse_writepage_locked(struct page *page) | |||
1524 | struct fuse_inode *fi = get_fuse_inode(inode); | 1526 | struct fuse_inode *fi = get_fuse_inode(inode); |
1525 | struct fuse_req *req; | 1527 | struct fuse_req *req; |
1526 | struct page *tmp_page; | 1528 | struct page *tmp_page; |
1529 | int error = -ENOMEM; | ||
1527 | 1530 | ||
1528 | set_page_writeback(page); | 1531 | set_page_writeback(page); |
1529 | 1532 | ||
@@ -1536,7 +1539,11 @@ static int fuse_writepage_locked(struct page *page) | |||
1536 | if (!tmp_page) | 1539 | if (!tmp_page) |
1537 | goto err_free; | 1540 | goto err_free; |
1538 | 1541 | ||
1542 | error = -EIO; | ||
1539 | req->ff = fuse_write_file(fc, fi); | 1543 | req->ff = fuse_write_file(fc, fi); |
1544 | if (!req->ff) | ||
1545 | goto err_free; | ||
1546 | |||
1540 | fuse_write_fill(req, req->ff, page_offset(page), 0); | 1547 | fuse_write_fill(req, req->ff, page_offset(page), 0); |
1541 | 1548 | ||
1542 | copy_highpage(tmp_page, page); | 1549 | copy_highpage(tmp_page, page); |
@@ -1566,7 +1573,7 @@ err_free: | |||
1566 | fuse_request_free(req); | 1573 | fuse_request_free(req); |
1567 | err: | 1574 | err: |
1568 | end_page_writeback(page); | 1575 | end_page_writeback(page); |
1569 | return -ENOMEM; | 1576 | return error; |
1570 | } | 1577 | } |
1571 | 1578 | ||
1572 | static int fuse_writepage(struct page *page, struct writeback_control *wbc) | 1579 | static int fuse_writepage(struct page *page, struct writeback_control *wbc) |