From: Trond Myklebust <trond.myklebust@fys.uio.no>

--=-aCxixXOUJ+rpOGcF3KKD
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

NFSv2/v3/v4: Prepare the nfs_page struct to allow for asynchronous
reads/writes with rsize/wsize < PAGE_SIZE.

Cheers,
 Trond

--=-aCxixXOUJ+rpOGcF3KKD
Content-Disposition: attachment; filename=linux-2.6.4-01-prepare_nfspage.dif
Content-Type: text/plain; name=linux-2.6.4-01-prepare_nfspage.dif; charset=ISO-8859-1
Content-Transfer-Encoding: base64

IGZzL25mcy9wYWdlbGlzdC5jICAgICAgICB8ICAgIDEgKw0KIGluY2x1ZGUvbGludXgvbmZzX3Bh
Z2UuaCB8ICAgMzkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQogaW5j
bHVkZS9saW51eC9uZnNfeGRyLmggIHwgICAgOCArKysrKystLQ0KIDMgZmlsZXMgY2hhbmdlZCwg
NDYgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkNCg0KZGlmZiAtdSAtLXJlY3Vyc2l2ZSAt
LW5ldy1maWxlIC0tc2hvdy1jLWZ1bmN0aW9uIGxpbnV4LTIuNi4zLTE4LW5mczJfcmVhZC9mcy9u
ZnMvcGFnZWxpc3QuYyBsaW51eC0yLjYuMy0xOS1wcmVwYXJlX25mc3BhZ2UvZnMvbmZzL3BhZ2Vs
aXN0LmMNCi0tLSBsaW51eC0yLjYuMy0xOC1uZnMyX3JlYWQvZnMvbmZzL3BhZ2VsaXN0LmMJMjAw
NC0wMi0yOSAxMzozMzozNC4wMDAwMDAwMDAgLTA4MDANCisrKyBsaW51eC0yLjYuMy0xOS1wcmVw
YXJlX25mc3BhZ2UvZnMvbmZzL3BhZ2VsaXN0LmMJMjAwNC0wMi0yOSAxMzozNTozNC4wMDAwMDAw
MDAgLTA4MDANCkBAIC04OCw2ICs4OCw3IEBAIG5mc19jcmVhdGVfcmVxdWVzdChzdHJ1Y3QgZmls
ZSAqZmlsZSwgc3QNCiAJICogbG9uZyB3cml0ZS1iYWNrIGRlbGF5LiBUaGlzIHdpbGwgYmUgYWRq
dXN0ZWQgaW4NCiAJICogdXBkYXRlX25mc19yZXF1ZXN0IGJlbG93IGlmIHRoZSByZWdpb24gaXMg
bm90IGxvY2tlZC4gKi8NCiAJcmVxLT53Yl9wYWdlICAgID0gcGFnZTsNCisJYXRvbWljX3NldCgm
cmVxLT53Yl9jb21wbGV0ZSwgMCk7DQogCXJlcS0+d2JfaW5kZXgJPSBwYWdlLT5pbmRleDsNCiAJ
cGFnZV9jYWNoZV9nZXQocGFnZSk7DQogCXJlcS0+d2Jfb2Zmc2V0ICA9IG9mZnNldDsNCmRpZmYg
LXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSAtLXNob3ctYy1mdW5jdGlvbiBsaW51eC0yLjYuMy0x
OC1uZnMyX3JlYWQvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oIGxpbnV4LTIuNi4zLTE5LXByZXBh
cmVfbmZzcGFnZS9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmgNCi0tLSBsaW51eC0yLjYuMy0xOC1u
ZnMyX3JlYWQvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oCTIwMDQtMDItMjkgMTM6MzM6MzQuMDAw
MDAwMDAwIC0wODAwDQorKysgbGludXgtMi42LjMtMTktcHJlcGFyZV9uZnNwYWdlL2luY2x1ZGUv
bGludXgvbmZzX3BhZ2UuaAkyMDA0LTAyLTI5IDEzOjM1OjM0LjAwMDAwMDAwMCAtMDgwMA0KQEAg
LTE3LDEwICsxNywxNCBAQA0KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPg0KICNpbmNs
dWRlIDxsaW51eC9uZnNfeGRyLmg+DQogDQorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4NCisNCiAv
Kg0KICAqIFZhbGlkIGZsYWdzIGZvciBhIGRpcnR5IGJ1ZmZlcg0KICAqLw0KICNkZWZpbmUgUEdf
QlVTWQkJCTANCisjZGVmaW5lIFBHX05FRURfQ09NTUlUCQkxDQorI2RlZmluZSBQR19ORUVEX1JF
U0NIRUQJCTINCiANCiBzdHJ1Y3QgbmZzX3BhZ2Ugew0KIAlzdHJ1Y3QgbGlzdF9oZWFkCXdiX2xp
c3QsCS8qIERlZmluZXMgc3RhdGUgb2YgcGFnZTogKi8NCkBAIC0zMSw2ICszNSw3IEBAIHN0cnVj
dCBuZnNfcGFnZSB7DQogCXN0cnVjdCBycGNfY3JlZAkJKndiX2NyZWQ7DQogCXN0cnVjdCBuZnM0
X3N0YXRlCSp3Yl9zdGF0ZTsNCiAJc3RydWN0IHBhZ2UJCSp3Yl9wYWdlOwkvKiBwYWdlIHRvIHJl
YWQgaW4vd3JpdGUgb3V0ICovDQorCWF0b21pY190CQl3Yl9jb21wbGV0ZTsJLyogaS9vcyB3ZSdy
ZSB3YWl0aW5nIGZvciAqLw0KIAl3YWl0X3F1ZXVlX2hlYWRfdAl3Yl93YWl0OwkvKiB3YWl0IHF1
ZXVlICovDQogCXVuc2lnbmVkIGxvbmcJCXdiX2luZGV4OwkvKiBPZmZzZXQgPj4gUEFHRV9DQUNI
RV9TSElGVCAqLw0KIAl1bnNpZ25lZCBpbnQJCXdiX29mZnNldCwJLyogT2Zmc2V0ICYgflBBR0Vf
Q0FDSEVfTUFTSyAqLw0KQEAgLTQyLDYgKzQ3LDggQEAgc3RydWN0IG5mc19wYWdlIHsNCiB9Ow0K
IA0KICNkZWZpbmUgTkZTX1dCQUNLX0JVU1kocmVxKQkodGVzdF9iaXQoUEdfQlVTWSwmKHJlcSkt
PndiX2ZsYWdzKSkNCisjZGVmaW5lIE5GU19ORUVEX0NPTU1JVChyZXEpCSh0ZXN0X2JpdChQR19O
RUVEX0NPTU1JVCwmKHJlcSktPndiX2ZsYWdzKSkNCisjZGVmaW5lIE5GU19ORUVEX1JFU0NIRUQo
cmVxKQkodGVzdF9iaXQoUEdfTkVFRF9SRVNDSEVELCYocmVxKS0+d2JfZmxhZ3MpKQ0KIA0KIGV4
dGVybglzdHJ1Y3QgbmZzX3BhZ2UgKm5mc19jcmVhdGVfcmVxdWVzdChzdHJ1Y3QgZmlsZSAqLCBz
dHJ1Y3QgaW5vZGUgKiwNCiAJCQkJCSAgICBzdHJ1Y3QgcGFnZSAqLA0KQEAgLTExNSw2ICsxMjIs
MzggQEAgbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlIA0KIAlyZXEtPndi
X2xpc3RfaGVhZCA9IE5VTEw7DQogfQ0KIA0KK3N0YXRpYyBpbmxpbmUgaW50DQorbmZzX2RlZmVy
X2NvbW1pdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkNCit7DQorCWlmICh0ZXN0X2FuZF9zZXRfYml0
KFBHX05FRURfQ09NTUlULCAmcmVxLT53Yl9mbGFncykpDQorCQlyZXR1cm4gMDsNCisJcmV0dXJu
IDE7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZA0KK25mc19jbGVhcl9jb21taXQoc3RydWN0
IG5mc19wYWdlICpyZXEpDQorew0KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsNCisJY2xl
YXJfYml0KFBHX05FRURfQ09NTUlULCAmcmVxLT53Yl9mbGFncyk7DQorCXNtcF9tYl9fYWZ0ZXJf
Y2xlYXJfYml0KCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgaW50DQorbmZzX2RlZmVyX3Jlc2No
ZWR1bGUoc3RydWN0IG5mc19wYWdlICpyZXEpDQorew0KKwlpZiAodGVzdF9hbmRfc2V0X2JpdChQ
R19ORUVEX1JFU0NIRUQsICZyZXEtPndiX2ZsYWdzKSkNCisJCXJldHVybiAwOw0KKwlyZXR1cm4g
MTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkDQorbmZzX2NsZWFyX3Jlc2NoZWR1bGUoc3Ry
dWN0IG5mc19wYWdlICpyZXEpDQorew0KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsNCisJ
Y2xlYXJfYml0KFBHX05FRURfUkVTQ0hFRCwgJnJlcS0+d2JfZmxhZ3MpOw0KKwlzbXBfbWJfX2Fm
dGVyX2NsZWFyX2JpdCgpOw0KK30NCisNCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnNfcGFnZSAq
DQogbmZzX2xpc3RfZW50cnkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkNCiB7DQpkaWZmIC11IC0t
cmVjdXJzaXZlIC0tbmV3LWZpbGUgLS1zaG93LWMtZnVuY3Rpb24gbGludXgtMi42LjMtMTgtbmZz
Ml9yZWFkL2luY2x1ZGUvbGludXgvbmZzX3hkci5oIGxpbnV4LTIuNi4zLTE5LXByZXBhcmVfbmZz
cGFnZS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaA0KLS0tIGxpbnV4LTIuNi4zLTE4LW5mczJfcmVh
ZC9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAkyMDA0LTAyLTI5IDEzOjMzOjI3LjAwMDAwMDAwMCAt
MDgwMA0KKysrIGxpbnV4LTIuNi4zLTE5LXByZXBhcmVfbmZzcGFnZS9pbmNsdWRlL2xpbnV4L25m
c194ZHIuaAkyMDA0LTAyLTI5IDE4OjI1OjM0LjAwMDAwMDAwMCAtMDgwMA0KQEAgLTY1Niw2ICs2
NTYsOCBAQCBzdHJ1Y3QgbmZzNF9jb21wb3VuZCB7DQogDQogI2VuZGlmIC8qIENPTkZJR19ORlNf
VjQgKi8NCiANCitzdHJ1Y3QgbmZzX3BhZ2U7DQorDQogc3RydWN0IG5mc19yZWFkX2RhdGEgew0K
IAlpbnQJCQlmbGFnczsNCiAJc3RydWN0IHJwY190YXNrCQl0YXNrOw0KQEAgLTY2NCwxMiArNjY2
LDE0IEBAIHN0cnVjdCBuZnNfcmVhZF9kYXRhIHsNCiAJZmxfb3duZXJfdAkJbG9ja293bmVyOw0K
IAlzdHJ1Y3QgbmZzX2ZhdHRyCWZhdHRyOwkvKiBmYXR0ciBzdG9yYWdlICovDQogCXN0cnVjdCBs
aXN0X2hlYWQJcGFnZXM7CS8qIENvYWxlc2NlZCByZWFkIHJlcXVlc3RzICovDQorCXN0cnVjdCBu
ZnNfcGFnZQkJKnJlcTsJLyogbXVsdGkgb3BzIHBlciBuZnNfcGFnZSAqLw0KIAlzdHJ1Y3QgcGFn
ZQkJKnBhZ2V2ZWNbTkZTX1JFQURfTUFYSU9WXTsNCiAJc3RydWN0IG5mc19yZWFkYXJncyBhcmdz
Ow0KIAlzdHJ1Y3QgbmZzX3JlYWRyZXMgIHJlczsNCiAjaWZkZWYgQ09ORklHX05GU19WNA0KIAl1
bnNpZ25lZCBsb25nCQl0aW1lc3RhbXA7CS8qIEZvciBsZWFzZSByZW5ld2FsICovDQogI2VuZGlm
DQorCXZvaWQgKCpjb21wbGV0ZSkgKHN0cnVjdCBuZnNfcmVhZF9kYXRhICosIGludCk7DQogfTsN
CiANCiBzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgew0KQEAgLTY4MSwxNiArNjg1LDE2IEBAIHN0cnVj
dCBuZnNfd3JpdGVfZGF0YSB7DQogCXN0cnVjdCBuZnNfZmF0dHIJZmF0dHI7DQogCXN0cnVjdCBu
ZnNfd3JpdGV2ZXJmCXZlcmY7DQogCXN0cnVjdCBsaXN0X2hlYWQJcGFnZXM7CQkvKiBDb2FsZXNj
ZWQgcmVxdWVzdHMgd2Ugd2lzaCB0byBmbHVzaCAqLw0KKwlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXE7
CQkvKiBtdWx0aSBvcHMgcGVyIG5mc19wYWdlICovDQogCXN0cnVjdCBwYWdlCQkqcGFnZXZlY1tO
RlNfV1JJVEVfTUFYSU9WXTsNCiAJc3RydWN0IG5mc193cml0ZWFyZ3MJYXJnczsJCS8qIGFyZ3Vt
ZW50IHN0cnVjdCAqLw0KIAlzdHJ1Y3QgbmZzX3dyaXRlcmVzCXJlczsJCS8qIHJlc3VsdCBzdHJ1
Y3QgKi8NCiAjaWZkZWYgQ09ORklHX05GU19WNA0KIAl1bnNpZ25lZCBsb25nCQl0aW1lc3RhbXA7
CS8qIEZvciBsZWFzZSByZW5ld2FsICovDQogI2VuZGlmDQorCXZvaWQgKCpjb21wbGV0ZSkgKHN0
cnVjdCBuZnNfd3JpdGVfZGF0YSAqLCBpbnQpOw0KIH07DQogDQotc3RydWN0IG5mc19wYWdlOw0K
LQ0KIC8qDQogICogUlBDIHByb2NlZHVyZSB2ZWN0b3IgZm9yIE5GU3YyL05GU3YzIGRlbXV4aW5n
DQogICovDQo=

--=-aCxixXOUJ+rpOGcF3KKD--



---

 25-akpm/fs/nfs/pagelist.c        |    1 +
 25-akpm/include/linux/nfs_page.h |   39 +++++++++++++++++++++++++++++++++++++++
 25-akpm/include/linux/nfs_xdr.h  |    8 ++++++--
 3 files changed, 46 insertions(+), 2 deletions(-)

diff -puN fs/nfs/pagelist.c~nfs-01-prepare_nfspage fs/nfs/pagelist.c
--- 25/fs/nfs/pagelist.c~nfs-01-prepare_nfspage	2004-03-14 15:12:28.537392128 -0800
+++ 25-akpm/fs/nfs/pagelist.c	2004-03-14 15:12:28.542391368 -0800
@@ -88,6 +88,7 @@ nfs_create_request(struct file *file, st
 	 * long write-back delay. This will be adjusted in
 	 * update_nfs_request below if the region is not locked. */
 	req->wb_page    = page;
+	atomic_set(&req->wb_complete, 0);
 	req->wb_index	= page->index;
 	page_cache_get(page);
 	req->wb_offset  = offset;
diff -puN include/linux/nfs_page.h~nfs-01-prepare_nfspage include/linux/nfs_page.h
--- 25/include/linux/nfs_page.h~nfs-01-prepare_nfspage	2004-03-14 15:12:28.538391976 -0800
+++ 25-akpm/include/linux/nfs_page.h	2004-03-14 15:12:28.542391368 -0800
@@ -17,10 +17,14 @@
 #include <linux/sunrpc/auth.h>
 #include <linux/nfs_xdr.h>
 
+#include <asm/atomic.h>
+
 /*
  * Valid flags for a dirty buffer
  */
 #define PG_BUSY			0
+#define PG_NEED_COMMIT		1
+#define PG_NEED_RESCHED		2
 
 struct nfs_page {
 	struct list_head	wb_list,	/* Defines state of page: */
@@ -31,6 +35,7 @@ struct nfs_page {
 	struct rpc_cred		*wb_cred;
 	struct nfs4_state	*wb_state;
 	struct page		*wb_page;	/* page to read in/write out */
+	atomic_t		wb_complete;	/* i/os we're waiting for */
 	wait_queue_head_t	wb_wait;	/* wait queue */
 	unsigned long		wb_index;	/* Offset >> PAGE_CACHE_SHIFT */
 	unsigned int		wb_offset,	/* Offset & ~PAGE_CACHE_MASK */
@@ -42,6 +47,8 @@ struct nfs_page {
 };
 
 #define NFS_WBACK_BUSY(req)	(test_bit(PG_BUSY,&(req)->wb_flags))
+#define NFS_NEED_COMMIT(req)	(test_bit(PG_NEED_COMMIT,&(req)->wb_flags))
+#define NFS_NEED_RESCHED(req)	(test_bit(PG_NEED_RESCHED,&(req)->wb_flags))
 
 extern	struct nfs_page *nfs_create_request(struct file *, struct inode *,
 					    struct page *,
@@ -115,6 +122,38 @@ nfs_list_remove_request(struct nfs_page 
 	req->wb_list_head = NULL;
 }
 
+static inline int
+nfs_defer_commit(struct nfs_page *req)
+{
+	if (test_and_set_bit(PG_NEED_COMMIT, &req->wb_flags))
+		return 0;
+	return 1;
+}
+
+static inline void
+nfs_clear_commit(struct nfs_page *req)
+{
+	smp_mb__before_clear_bit();
+	clear_bit(PG_NEED_COMMIT, &req->wb_flags);
+	smp_mb__after_clear_bit();
+}
+
+static inline int
+nfs_defer_reschedule(struct nfs_page *req)
+{
+	if (test_and_set_bit(PG_NEED_RESCHED, &req->wb_flags))
+		return 0;
+	return 1;
+}
+
+static inline void
+nfs_clear_reschedule(struct nfs_page *req)
+{
+	smp_mb__before_clear_bit();
+	clear_bit(PG_NEED_RESCHED, &req->wb_flags);
+	smp_mb__after_clear_bit();
+}
+
 static inline struct nfs_page *
 nfs_list_entry(struct list_head *head)
 {
diff -puN include/linux/nfs_xdr.h~nfs-01-prepare_nfspage include/linux/nfs_xdr.h
--- 25/include/linux/nfs_xdr.h~nfs-01-prepare_nfspage	2004-03-14 15:12:28.540391672 -0800
+++ 25-akpm/include/linux/nfs_xdr.h	2004-03-14 15:12:28.543391216 -0800
@@ -656,6 +656,8 @@ struct nfs4_compound {
 
 #endif /* CONFIG_NFS_V4 */
 
+struct nfs_page;
+
 struct nfs_read_data {
 	int			flags;
 	struct rpc_task		task;
@@ -664,12 +666,14 @@ struct nfs_read_data {
 	fl_owner_t		lockowner;
 	struct nfs_fattr	fattr;	/* fattr storage */
 	struct list_head	pages;	/* Coalesced read requests */
+	struct nfs_page		*req;	/* multi ops per nfs_page */
 	struct page		*pagevec[NFS_READ_MAXIOV];
 	struct nfs_readargs args;
 	struct nfs_readres  res;
 #ifdef CONFIG_NFS_V4
 	unsigned long		timestamp;	/* For lease renewal */
 #endif
+	void (*complete) (struct nfs_read_data *, int);
 };
 
 struct nfs_write_data {
@@ -681,16 +685,16 @@ struct nfs_write_data {
 	struct nfs_fattr	fattr;
 	struct nfs_writeverf	verf;
 	struct list_head	pages;		/* Coalesced requests we wish to flush */
+	struct nfs_page		*req;		/* multi ops per nfs_page */
 	struct page		*pagevec[NFS_WRITE_MAXIOV];
 	struct nfs_writeargs	args;		/* argument struct */
 	struct nfs_writeres	res;		/* result struct */
 #ifdef CONFIG_NFS_V4
 	unsigned long		timestamp;	/* For lease renewal */
 #endif
+	void (*complete) (struct nfs_write_data *, int);
 };
 
-struct nfs_page;
-
 /*
  * RPC procedure vector for NFSv2/NFSv3 demuxing
  */

_