* [PATCH] fix ->setattr ATTR_SIZE locking for nfsd
@ 2005-01-06 17:33 Christoph Hellwig
0 siblings, 0 replies; only message in thread
From: Christoph Hellwig @ 2005-01-06 17:33 UTC (permalink / raw)
To: akpm, mmontour; +Cc: roehrich, linux-fsdevel
Since the big direct I/O rework do_truncate takes i_alloc_sem before
calling into ->setattr. Unfortunately the other callers of ->setattr
with ATTR_SIZE, most notably nfsd don't take it.
The (out of tree) XFS dmapi code relies wants to release i_alloc_sem and
thus gets into problems like
http://oss.sgi.com/bugzilla/show_bug.cgi?id=365
This patch moves acquiring and releasing i_alloc_sem into
notify_change() to make the locking behaviour consistant.
Index: fs/attr.c
===================================================================
RCS file: /cvs/linux-2.6-xfs/fs/attr.c,v
retrieving revision 1.2
diff -u -p -r1.2 attr.c
--- fs/attr.c 16 Aug 2004 03:52:41 -0000 1.2
+++ fs/attr.c 6 Jan 2005 04:55:14 -0000
@@ -167,6 +167,9 @@ int notify_change(struct dentry * dentry
if (!attr->ia_valid)
return 0;
+ if (ia_valid & ATTR_SIZE)
+ down_write(&dentry->d_inode->i_alloc_sem);
+
if (inode->i_op && inode->i_op->setattr) {
error = security_inode_setattr(dentry, attr);
if (!error)
@@ -183,6 +186,10 @@ int notify_change(struct dentry * dentry
error = inode_setattr(inode, attr);
}
}
+
+ if (ia_valid & ATTR_SIZE)
+ up_write(&dentry->d_inode->i_alloc_sem);
+
if (!error) {
unsigned long dn_mask = setattr_mask(ia_valid);
if (dn_mask)
Index: fs/open.c
===================================================================
RCS file: /cvs/linux-2.6-xfs/fs/open.c,v
retrieving revision 1.7
diff -u -p -r1.7 open.c
--- fs/open.c 16 Aug 2004 03:52:41 -0000 1.7
+++ fs/open.c 6 Jan 2005 04:55:15 -0000
@@ -202,10 +202,9 @@ int do_truncate(struct dentry *dentry, l
newattrs.ia_size = length;
newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
+
down(&dentry->d_inode->i_sem);
- down_write(&dentry->d_inode->i_alloc_sem);
err = notify_change(dentry, &newattrs);
- up_write(&dentry->d_inode->i_alloc_sem);
up(&dentry->d_inode->i_sem);
return err;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-01-06 17:33 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-06 17:33 [PATCH] fix ->setattr ATTR_SIZE locking for nfsd Christoph Hellwig
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.