From: Trond Myklebust --=-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 #include +#include + /* * 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 */ _