All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] NFS: Ensure that we break out of read/write_schedule_segment on error
@ 2012-04-30 18:00 Trond Myklebust
  2012-04-30 18:00 ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Trond Myklebust
  0 siblings, 1 reply; 5+ messages in thread
From: Trond Myklebust @ 2012-04-30 18:00 UTC (permalink / raw)
  To: linux-nfs; +Cc: Fred Isaman

Currently we do break out of the for() loop, but we also need to
break out of the enclosing do {} while()...

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Fred Isaman <iisaman@netapp.com>
---
 fs/nfs/direct.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index d44de2f..5ce5c6b 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -396,7 +396,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
 			pos += req_len;
 			count -= req_len;
 		}
-	} while (count != 0);
+	} while (count != 0 && result >= 0);
 
 	kfree(pagevec);
 
@@ -689,6 +689,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
 				nfs_release_request(req);
 				nfs_direct_release_pages(pagevec + i,
 							 npages - i);
+				break;
 			}
 			pgbase = 0;
 			bytes -= req_len;
@@ -697,7 +698,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
 			pos += req_len;
 			count -= req_len;
 		}
-	} while (count != 0);
+	} while (count != 0 && result >= 0);
 
 	kfree(pagevec);
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request
  2012-04-30 18:00 [PATCH 1/3] NFS: Ensure that we break out of read/write_schedule_segment on error Trond Myklebust
@ 2012-04-30 18:00 ` Trond Myklebust
  2012-04-30 18:00   ` [PATCH 3/3] NFS: Simplify O_DIRECT page referencing Trond Myklebust
  2012-04-30 18:05   ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Myklebust, Trond
  0 siblings, 2 replies; 5+ messages in thread
From: Trond Myklebust @ 2012-04-30 18:00 UTC (permalink / raw)
  To: linux-nfs; +Cc: Fred Isaman

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Fred Isaman <iisaman@netapp.com>
---
 fs/nfs/direct.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 5ce5c6b..450ba54 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -292,7 +292,7 @@ out_put:
 	hdr->release(hdr);
 }
 
-static void nfs_sync_pgio_error(struct list_head *head)
+static void nfs_read_sync_pgio_error(struct list_head *head)
 {
 	struct nfs_page *req;
 
@@ -309,7 +309,7 @@ static void nfs_direct_pgio_init(struct nfs_pgio_header *hdr)
 }
 
 static const struct nfs_pgio_completion_ops nfs_direct_read_completion_ops = {
-	.error_cleanup = nfs_sync_pgio_error,
+	.error_cleanup = nfs_read_sync_pgio_error,
 	.init_hdr = nfs_direct_pgio_init,
 	.completion = nfs_direct_read_completion,
 };
@@ -772,8 +772,20 @@ out_put:
 	hdr->release(hdr);
 }
 
+static void nfs_write_sync_pgio_error(struct list_head *head)
+{
+	struct nfs_page *req;
+
+	while (!list_empty(head)) {
+		req = nfs_list_entry(head->next);
+		nfs_list_remove_request(req);
+		nfs_release_request(req);
+		nfs_unlock_request(req);
+	}
+}
+
 static const struct nfs_pgio_completion_ops nfs_direct_write_completion_ops = {
-	.error_cleanup = nfs_sync_pgio_error,
+	.error_cleanup = nfs_write_sync_pgio_error,
 	.init_hdr = nfs_direct_pgio_init,
 	.completion = nfs_direct_write_completion,
 };
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] NFS: Simplify O_DIRECT page referencing
  2012-04-30 18:00 ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Trond Myklebust
@ 2012-04-30 18:00   ` Trond Myklebust
  2012-04-30 18:05   ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Myklebust, Trond
  1 sibling, 0 replies; 5+ messages in thread
From: Trond Myklebust @ 2012-04-30 18:00 UTC (permalink / raw)
  To: linux-nfs; +Cc: Fred Isaman

The O_DIRECT code shouldn't need to hold 2 references to each page. The
reference held by the struct nfs_page should suffice.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Fred Isaman <iisaman@netapp.com>
---
 fs/nfs/direct.c |   22 ++++++----------------
 1 files changed, 6 insertions(+), 16 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 450ba54..31d0624 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -268,10 +268,9 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
 			}
 			bytes += req->wb_bytes;
 			nfs_list_remove_request(req);
-			nfs_direct_readpage_release(req);
 			if (!PageCompound(page))
 				set_page_dirty(page);
-			page_cache_release(page);
+			nfs_direct_readpage_release(req);
 		}
 	} else {
 		while (!list_empty(&hdr->pages)) {
@@ -281,7 +280,6 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
 				if (!PageCompound(req->wb_page))
 					set_page_dirty(req->wb_page);
 			bytes += req->wb_bytes;
-			page_cache_release(req->wb_page);
 			nfs_list_remove_request(req);
 			nfs_direct_readpage_release(req);
 		}
@@ -375,8 +373,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
 						 pagevec[i],
 						 pgbase, req_len);
 			if (IS_ERR(req)) {
-				nfs_direct_release_pages(pagevec + i,
-							 npages - i);
 				result = PTR_ERR(req);
 				break;
 			}
@@ -385,8 +381,6 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
 			if (!nfs_pageio_add_request(desc, req)) {
 				result = desc->pg_error;
 				nfs_release_request(req);
-				nfs_direct_release_pages(pagevec + i,
-							 npages - i);
 				break;
 			}
 			pgbase = 0;
@@ -396,6 +390,8 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
 			pos += req_len;
 			count -= req_len;
 		}
+		/* The nfs_page now hold references to these pages */
+		nfs_direct_release_pages(pagevec, npages);
 	} while (count != 0 && result >= 0);
 
 	kfree(pagevec);
@@ -509,7 +505,6 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
 	nfs_pageio_complete(&desc);
 
 	while (!list_empty(&failed)) {
-		page_cache_release(req->wb_page);
 		nfs_release_request(req);
 		nfs_unlock_request(req);
 	}
@@ -542,10 +537,8 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data)
 		if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) {
 			/* Note the rewrite will go through mds */
 			nfs_mark_request_commit(req, NULL, &cinfo);
-		} else {
-			page_cache_release(req->wb_page);
+		} else
 			nfs_release_request(req);
-		}
 		nfs_unlock_request(req);
 	}
 
@@ -675,8 +668,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
 						 pagevec[i],
 						 pgbase, req_len);
 			if (IS_ERR(req)) {
-				nfs_direct_release_pages(pagevec + i,
-							 npages - i);
 				result = PTR_ERR(req);
 				break;
 			}
@@ -687,8 +678,6 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
 				result = desc->pg_error;
 				nfs_unlock_request(req);
 				nfs_release_request(req);
-				nfs_direct_release_pages(pagevec + i,
-							 npages - i);
 				break;
 			}
 			pgbase = 0;
@@ -698,6 +687,8 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d
 			pos += req_len;
 			count -= req_len;
 		}
+		/* The nfs_page now hold references to these pages */
+		nfs_direct_release_pages(pagevec, npages);
 	} while (count != 0 && result >= 0);
 
 	kfree(pagevec);
@@ -760,7 +751,6 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
 			nfs_mark_request_commit(req, hdr->lseg, &cinfo);
 			break;
 		default:
-			page_cache_release(req->wb_page);
 			nfs_release_request(req);
 		}
 		nfs_unlock_request(req);
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request
  2012-04-30 18:00 ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Trond Myklebust
  2012-04-30 18:00   ` [PATCH 3/3] NFS: Simplify O_DIRECT page referencing Trond Myklebust
@ 2012-04-30 18:05   ` Myklebust, Trond
  2012-04-30 18:14     ` Fred Isaman
  1 sibling, 1 reply; 5+ messages in thread
From: Myklebust, Trond @ 2012-04-30 18:05 UTC (permalink / raw)
  To: linux-nfs; +Cc: Isaman, Fred

T24gTW9uLCAyMDEyLTA0LTMwIGF0IDE0OjAwIC0wNDAwLCBUcm9uZCBNeWtsZWJ1c3Qgd3JvdGU6
DQo+IFNpZ25lZC1vZmYtYnk6IFRyb25kIE15a2xlYnVzdCA8VHJvbmQuTXlrbGVidXN0QG5ldGFw
cC5jb20+DQo+IENjOiBGcmVkIElzYW1hbiA8aWlzYW1hbkBuZXRhcHAuY29tPg0KPiAtLS0NCj4g
IGZzL25mcy9kaXJlY3QuYyB8ICAgMTggKysrKysrKysrKysrKysrLS0tDQo+ICAxIGZpbGVzIGNo
YW5nZWQsIDE1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0
IGEvZnMvbmZzL2RpcmVjdC5jIGIvZnMvbmZzL2RpcmVjdC5jDQo+IGluZGV4IDVjZTVjNmIuLjQ1
MGJhNTQgMTAwNjQ0DQo+IC0tLSBhL2ZzL25mcy9kaXJlY3QuYw0KPiArKysgYi9mcy9uZnMvZGly
ZWN0LmMNCj4gQEAgLTI5Miw3ICsyOTIsNyBAQCBvdXRfcHV0Og0KPiAgCWhkci0+cmVsZWFzZSho
ZHIpOw0KPiAgfQ0KPiAgDQo+IC1zdGF0aWMgdm9pZCBuZnNfc3luY19wZ2lvX2Vycm9yKHN0cnVj
dCBsaXN0X2hlYWQgKmhlYWQpDQo+ICtzdGF0aWMgdm9pZCBuZnNfcmVhZF9zeW5jX3BnaW9fZXJy
b3Ioc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkNCj4gIHsNCj4gIAlzdHJ1Y3QgbmZzX3BhZ2UgKnJl
cTsNCj4gIA0KPiBAQCAtMzA5LDcgKzMwOSw3IEBAIHN0YXRpYyB2b2lkIG5mc19kaXJlY3RfcGdp
b19pbml0KHN0cnVjdCBuZnNfcGdpb19oZWFkZXIgKmhkcikNCj4gIH0NCj4gIA0KPiAgc3RhdGlj
IGNvbnN0IHN0cnVjdCBuZnNfcGdpb19jb21wbGV0aW9uX29wcyBuZnNfZGlyZWN0X3JlYWRfY29t
cGxldGlvbl9vcHMgPSB7DQo+IC0JLmVycm9yX2NsZWFudXAgPSBuZnNfc3luY19wZ2lvX2Vycm9y
LA0KPiArCS5lcnJvcl9jbGVhbnVwID0gbmZzX3JlYWRfc3luY19wZ2lvX2Vycm9yLA0KPiAgCS5p
bml0X2hkciA9IG5mc19kaXJlY3RfcGdpb19pbml0LA0KPiAgCS5jb21wbGV0aW9uID0gbmZzX2Rp
cmVjdF9yZWFkX2NvbXBsZXRpb24sDQo+ICB9Ow0KPiBAQCAtNzcyLDggKzc3MiwyMCBAQCBvdXRf
cHV0Og0KPiAgCWhkci0+cmVsZWFzZShoZHIpOw0KPiAgfQ0KPiAgDQo+ICtzdGF0aWMgdm9pZCBu
ZnNfd3JpdGVfc3luY19wZ2lvX2Vycm9yKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpDQo+ICt7DQo+
ICsJc3RydWN0IG5mc19wYWdlICpyZXE7DQo+ICsNCj4gKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVh
ZCkpIHsNCj4gKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7DQo+ICsJCW5mc19s
aXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7DQo+ICsJCW5mc19yZWxlYXNlX3JlcXVlc3QocmVxKTsN
Cj4gKwkJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICBzdGF0
aWMgY29uc3Qgc3RydWN0IG5mc19wZ2lvX2NvbXBsZXRpb25fb3BzIG5mc19kaXJlY3Rfd3JpdGVf
Y29tcGxldGlvbl9vcHMgPSB7DQo+IC0JLmVycm9yX2NsZWFudXAgPSBuZnNfc3luY19wZ2lvX2Vy
cm9yLA0KPiArCS5lcnJvcl9jbGVhbnVwID0gbmZzX3dyaXRlX3N5bmNfcGdpb19lcnJvciwNCj4g
IAkuaW5pdF9oZHIgPSBuZnNfZGlyZWN0X3BnaW9faW5pdCwNCj4gIAkuY29tcGxldGlvbiA9IG5m
c19kaXJlY3Rfd3JpdGVfY29tcGxldGlvbiwNCj4gIH07DQoNCkFsdGVybmF0aXZlbHksIHdlIGNv
dWxkIHByb2JhYmx5IGp1c3Qgc2VuZCB0aGUgd3JpdGUgcmVxdWVzdHMgaW4gYW4NCnVubG9ja2Vk
IHN0YXRlLiBUaGV5IGFyZW4ndCBzdXBwb3NlZCB0byBiZSB2aXNpYmxlIHRvIGFueXRoaW5nIHZp
YSBhbnkNCmdsb2JhbCBsaXN0cy4uLg0KDQotLSANClRyb25kIE15a2xlYnVzdA0KTGludXggTkZT
IGNsaWVudCBtYWludGFpbmVyDQoNCk5ldEFwcA0KVHJvbmQuTXlrbGVidXN0QG5ldGFwcC5jb20N
Cnd3dy5uZXRhcHAuY29tDQoNCg==

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request
  2012-04-30 18:05   ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Myklebust, Trond
@ 2012-04-30 18:14     ` Fred Isaman
  0 siblings, 0 replies; 5+ messages in thread
From: Fred Isaman @ 2012-04-30 18:14 UTC (permalink / raw)
  To: Myklebust, Trond; +Cc: linux-nfs, Isaman, Fred

On Mon, Apr 30, 2012 at 2:05 PM, Myklebust, Trond
<Trond.Myklebust@netapp.com> wrote:
> Alternatively, we could probably just send the write requests in an
> unlocked state. They aren't supposed to be visible to anything via any
> global lists...
>


The existing lock/commit code fairly often assumes the reqs are
locked.  I found it simpler to just lock the req than to audit all the
code paths looking for where the assumptions made a difference.

Fred

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-04-30 18:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-30 18:00 [PATCH 1/3] NFS: Ensure that we break out of read/write_schedule_segment on error Trond Myklebust
2012-04-30 18:00 ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Trond Myklebust
2012-04-30 18:00   ` [PATCH 3/3] NFS: Simplify O_DIRECT page referencing Trond Myklebust
2012-04-30 18:05   ` [PATCH 2/3] NFS: O_DIRECT pgio_completion_ops error_cleanup must unlock the request Myklebust, Trond
2012-04-30 18:14     ` Fred Isaman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.