Unverified Commit 7381b6e9 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!9509 cifs: fix pagecache leak when do writepages

parents 7a38f198 80d2a63e
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -2856,17 +2856,21 @@ static ssize_t cifs_write_back_from_locked_folio(struct address_space *mapping,
	rc = cifs_get_writable_file(CIFS_I(inode), FIND_WR_ANY, &cfile);
	if (rc) {
		cifs_dbg(VFS, "No writable handle in writepages rc=%d\n", rc);
		folio_unlock(folio);
		goto err_xid;
	}

	rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->wsize,
					   &wsize, credits);
	if (rc != 0)
	if (rc != 0) {
		folio_unlock(folio);
		goto err_close;
	}

	wdata = cifs_writedata_alloc(cifs_writev_complete);
	if (!wdata) {
		rc = -ENOMEM;
		folio_unlock(folio);
		goto err_uncredit;
	}

@@ -3013,17 +3017,22 @@ static ssize_t cifs_writepages_begin(struct address_space *mapping,
lock_again:
	if (wbc->sync_mode != WB_SYNC_NONE) {
		ret = folio_lock_killable(folio);
		if (ret < 0)
		if (ret < 0) {
			folio_put(folio);
			return ret;
		}
	} else {
		if (!folio_trylock(folio))
		if (!folio_trylock(folio)) {
			folio_put(folio);
			goto search_again;
		}
	}

	if (folio->mapping != mapping ||
	    !folio_test_dirty(folio)) {
		start += folio_size(folio);
		folio_unlock(folio);
		folio_put(folio);
		goto search_again;
	}

@@ -3053,6 +3062,7 @@ static ssize_t cifs_writepages_begin(struct address_space *mapping,
out:
	if (ret > 0)
		*_start = start + ret;
	folio_put(folio);
	return ret;
}