[PATCH] bug in nfsd (incorrect handling of truncate)

Alexander Viro (viro@math.psu.edu)
Fri, 13 Nov 1998 11:09:38 -0500 (EST)


This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-1804928587-910973179=:6258
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
Content-ID: <Pine.SOL.3.95.981113110631.6258D@cayley.math.psu.edu>

Bug in nfsd: nfsd_setattr() doesn't do vmtruncate() and doesn't
touch the semaphore on inode it's truncating. I rewrote it (monkeyed up
from nfsd_truncate and do_truncate). As the result we've got the following
situation: foo->i_op->truncate being called _only_ after vmtruncate()
preceeded by notify_change() with ATTR_SIZE set and all calls of
notify_change() with ATTR_SIZE set are followed by this sequence
(nfsd_setattr was the last offender). Thus I've moved vmtruncate()/
foo->i_op->truncate() calls in the end of notify_change().
Affected functions: notify_change(), do_truncate(), nfsd_setattr(),
nfsd_truncate(). From the filesystem drivers' POV nothing changed.
Patch (against 2.1.128-pre1, but relevant files didn't change
between 2.1.128-pre1 and 2.1.128) attached.

If nobody will object I'll do the following: move the vmtruncate
and i_op->truncate calls into inode_set_attr(). It will mean that
1) nfs, coda, ncpfs and smbfs will have to call vmtruncate() by hands _or_
we'll do it from notify_change() for them - they can be distinguished from
those who call inode_setattr() since they are only ones who have
i_op->notify_change and don't have i_op->truncate() (yes, ugly hack, but...)

2) umsdos handling of notify_change method will be slightly modified (locking).

3) we'll be able to do truncate right, i.e. make it return meaningful error
codes when something fails and avoid the situation when truncate fails but
the i_size remains changed. That will mean that truncate becomes
int (*truncate)(struct inode*, off_t size) instead of void (*truncate)(struct
inode*). Yes, it means changing the interface, but the changes to filesystem
drivers would be minimal - to emulate current behaviour one has to replace
void frobfs_truncate(struct inode *inode)
{
bar();
}
with
int frobfs_truncate(struct inode *inode, off_t size)
{
inode->i_size = size;
bar();
return 0;
}
We should do it for weird filesystems anyway - since we are dealing with
FAT and its ugly brethren we have situations when size-increasing truncate
is impossible. Right now sys_truncate happily returns 0 in such cases. And
there always are IO errors, even for sane filesystems.
Cheers,
Al
PS: Apologies for missed definitions in minix_fs.h ;-<<

-- 
There are no "civil aviation for dummies" books out there and most of
you would probably be scared and spend a lot of your time looking up
if there was one. :-)			  Jordan Hubbard in c.u.b.f.m

---559023410-1804928587-910973179=:6258 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME=foo1 Content-Transfer-Encoding: BASE64 Content-ID: <Pine.SOL.3.95.981113110619.6258B@cayley.math.psu.edu> Content-Description:

LS0tIGZzL2F0dHIuYy5vbGQJRnJpIE5vdiAxMyAwNTowNToyOSAxOTk4DQor KysgZnMvYXR0ci5jCUZyaSBOb3YgMTMgMDU6MTA6MjEgMTk5OA0KQEAgLTg3 LDYgKzg3LDcgQEANCiAJaW50IGVycm9yOw0KIAl0aW1lX3Qgbm93ID0gQ1VS UkVOVF9USU1FOw0KIAl1bnNpZ25lZCBpbnQgaWFfdmFsaWQgPSBhdHRyLT5p YV92YWxpZDsNCisJdW5zaWduZWQgbG9uZyBzaXplID0gYXR0ci0+aWFfc2l6 ZTsNCiANCiAJYXR0ci0+aWFfY3RpbWUgPSBub3c7DQogCWlmICghKGlhX3Zh bGlkICYgQVRUUl9BVElNRV9TRVQpKQ0KQEAgLTEwMSw2ICsxMDIsMTEgQEAN CiAJCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsNCiAJ CWlmICghZXJyb3IpDQogCQkJaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7 DQorCX0NCisJaWYgKCFlcnJvciAmJiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUp KSB7DQorCQl2bXRydW5jYXRlKGlub2RlLCBzaXplKTsNCisJCWlmIChpbm9k ZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+dHJ1bmNhdGUpDQorCQkJaW5vZGUt Pmlfb3AtPnRydW5jYXRlKGlub2RlKTsNCiAJfQ0KIAlyZXR1cm4gZXJyb3I7 DQogfQ0KLS0tIGZzL29wZW4uYy5vbGQJRnJpIE5vdiAxMyAwNTowNzozNyAx OTk4DQorKysgZnMvb3Blbi5jCUZyaSBOb3YgMTMgMDU6MTE6MTAgMTk5OA0K QEAgLTg3LDEyICs4Nyw2IEBADQogCW5ld2F0dHJzLmlhX3NpemUgPSBsZW5n dGg7DQogCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9TSVpFIHwgQVRUUl9D VElNRTsNCiAJZXJyb3IgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0 dHJzKTsNCi0JaWYgKCFlcnJvcikgew0KLQkJLyogdHJ1bmNhdGUgdmlydHVh bCBtYXBwaW5ncyBvZiB0aGlzIGZpbGUgKi8NCi0JCXZtdHJ1bmNhdGUoaW5v ZGUsIGxlbmd0aCk7DQotCQlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlf b3AtPnRydW5jYXRlKQ0KLQkJCWlub2RlLT5pX29wLT50cnVuY2F0ZShpbm9k ZSk7DQotCX0NCiAJdXAoJmlub2RlLT5pX3NlbSk7DQogCXJldHVybiBlcnJv cjsNCiB9DQotLS0gZnMvbmZzZC92ZnMuYy5vbGQJRnJpIE5vdiAxMyAwMjoy NDozOSAxOTk4DQorKysgZnMvbmZzZC92ZnMuYwlGcmkgTm92IDEzIDA1OjEz OjU3IDE5OTgNCkBAIC0yMzIsMjkgKzIzMiw2IEBADQogCWRlbnRyeSA9IGZo cC0+ZmhfZGVudHJ5Ow0KIAlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsNCiAN Ci0JLyogVGhlIHNpemUgY2FzZSBpcyBzcGVjaWFsLi4uICovDQotCWlmIChp YXAtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7DQotaWYgKCFTX0lTUkVHKGlu b2RlLT5pX21vZGUpKQ0KLXByaW50aygibmZzZF9zZXRhdHRyOiBzaXplIGNo YW5nZT8/XG4iKTsNCi0JCWlmIChpYXAtPmlhX3NpemUgPCBpbm9kZS0+aV9z aXplKSB7DQotCQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+ZmhfZXhw b3J0LCBkZW50cnksIE1BWV9UUlVOQyk7DQotCQkJaWYgKGVyciAhPSAwKQ0K LQkJCQlnb3RvIG91dDsNCi0JCX0NCi0JCWVyciA9IGdldF93cml0ZV9hY2Nl c3MoaW5vZGUpOw0KLQkJaWYgKGVycikNCi0JCQlnb3RvIG91dF9uZnNlcnI7 DQotCQkvKiBOLkIuIFNob3VsZCB3ZSB1cGRhdGUgdGhlIGlub2RlIGNhY2hl IGhlcmU/ICovDQotCQlpbm9kZS0+aV9zaXplID0gaWFwLT5pYV9zaXplOw0K LQkJaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT50cnVuY2F0ZSkN Ci0JCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOw0KLQkJbWFya19p bm9kZV9kaXJ0eShpbm9kZSk7DQotCQlwdXRfd3JpdGVfYWNjZXNzKGlub2Rl KTsNCi0JCWlhcC0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsNCi0JCWlhcC0+ aWFfdmFsaWQgfD0gQVRUUl9NVElNRTsNCi0JCWlhcC0+aWFfbXRpbWUgPSBD VVJSRU5UX1RJTUU7DQotCX0NCi0NCiAJaW1vZGUgPSBpbm9kZS0+aV9tb2Rl Ow0KIAlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgew0KIAkJaWFw LT5pYV9tb2RlICY9IFNfSUFMTFVHTzsNCkBAIC0yNzMsMTEgKzI1MCwzMSBA QA0KIAkJaWFwLT5pYV9tb2RlID0gaW1vZGUgJj0gflNfSVNHSUQ7DQogCX0N CiANCisJLyogVGhlIHNpemUgY2FzZSBpcyBzcGVjaWFsLi4uICovDQorCWlm IChpYXAtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7DQoraWYgKCFTX0lTUkVH KGlub2RlLT5pX21vZGUpKQ0KK3ByaW50aygibmZzZF9zZXRhdHRyOiBzaXpl IGNoYW5nZT8/XG4iKTsNCisJCWlmIChpYXAtPmlhX3NpemUgPCBpbm9kZS0+ aV9zaXplKSB7DQorCQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+Zmhf ZXhwb3J0LCBkZW50cnksIE1BWV9UUlVOQyk7DQorCQkJaWYgKGVyciAhPSAw KQ0KKwkJCQlnb3RvIG91dDsNCisJCX0NCisJCWlhcC0+aWFfdmFsaWQgfD0g QVRUUl9NVElNRTsNCisJfQ0KKw0KIAkvKiBDaGFuZ2UgdGhlIGF0dHJpYnV0 ZXMuICovDQogCWlmIChpYXAtPmlhX3ZhbGlkKSB7DQogCQlpYXAtPmlhX3Zh bGlkIHw9IEFUVFJfQ1RJTUU7DQotIAkJaWFwLT5pYV9jdGltZSA9IENVUlJF TlRfVElNRTsNCi0JCWVyciA9IG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCBpYXAp Ow0KKwkJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsNCisJCQll cnIgPSBnZXRfd3JpdGVfYWNjZXNzKGlub2RlKTsNCisJCQlpZiAoZXJyKQ0K KwkJCQlnb3RvIG91dF9uZnNlcnI7DQorCQkJZmhfbG9jayhmaHApOw0KKwkJ CWVyciA9IG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCBpYXApOw0KKwkJCWZoX3Vu bG9jayhmaHApOw0KKwkJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOw0KKwkJ fSBlbHNlIA0KKwkJCWVyciA9IG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCBpYXAp Ow0KIAkJaWYgKGVycikNCiAJCQlnb3RvIG91dF9uZnNlcnI7DQogCQlpZiAo RVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkNCkBAIC03MzcsMTEgKzczNCw2 IEBADQogCW5ld2F0dHJzLmlhX3NpemUgPSBzaXplOw0KIAluZXdhdHRycy5p YV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7DQogCWVyciA9IG5v dGlmeV9jaGFuZ2UoZGVudHJ5LCAmbmV3YXR0cnMpOw0KLQlpZiAoIWVycikg ew0KLQkJdm10cnVuY2F0ZShpbm9kZSwgc2l6ZSk7DQotCQlpZiAoaW5vZGUt Pmlfb3AgJiYgaW5vZGUtPmlfb3AtPnRydW5jYXRlKQ0KLQkJCWlub2RlLT5p X29wLT50cnVuY2F0ZShpbm9kZSk7DQotCX0NCiAJcHV0X3dyaXRlX2FjY2Vz cyhpbm9kZSk7DQogCURRVU9UX0RST1AoaW5vZGUpOw0KIAlmaF91bmxvY2so ZmhwKTsNCg== ---559023410-1804928587-910973179=:6258--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/