]> err.no Git - linux-2.6/blobdiff - fs/nfsd/vfs.c
[PATCH] mutex subsystem, semaphore to mutex: VFS, ->i_sem
[linux-2.6] / fs / nfsd / vfs.c
index f83ab4cf426503d4b6714035e8b5601817e960c7..bb36b430449145355ccb79d1e99e72c75e72acc3 100644 (file)
@@ -390,12 +390,12 @@ set_nfsv4_acl_one(struct dentry *dentry, struct posix_acl *pacl, char *key)
 
        error = -EOPNOTSUPP;
        if (inode->i_op && inode->i_op->setxattr) {
-               down(&inode->i_sem);
+               mutex_lock(&inode->i_mutex);
                security_inode_setxattr(dentry, key, buf, len, 0);
                error = inode->i_op->setxattr(dentry, key, buf, len, 0);
                if (!error)
                        security_inode_post_setxattr(dentry, key, buf, len, 0);
-               up(&inode->i_sem);
+               mutex_unlock(&inode->i_mutex);
        }
 out:
        kfree(buf);
@@ -739,9 +739,9 @@ nfsd_sync(struct file *filp)
         int err;
        struct inode *inode = filp->f_dentry->d_inode;
        dprintk("nfsd: sync file %s\n", filp->f_dentry->d_name.name);
-       down(&inode->i_sem);
+       mutex_lock(&inode->i_mutex);
        err=nfsd_dosync(filp, filp->f_dentry, filp->f_op);
-       up(&inode->i_sem);
+       mutex_unlock(&inode->i_mutex);
 
        return err;
 }
@@ -880,6 +880,16 @@ out:
        return err;
 }
 
+static void kill_suid(struct dentry *dentry)
+{
+       struct iattr    ia;
+       ia.ia_valid = ATTR_KILL_SUID | ATTR_KILL_SGID;
+
+       mutex_lock(&dentry->d_inode->i_mutex);
+       notify_change(dentry, &ia);
+       mutex_unlock(&dentry->d_inode->i_mutex);
+}
+
 static inline int
 nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
                                loff_t offset, struct kvec *vec, int vlen,
@@ -933,14 +943,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
        }
 
        /* clear setuid/setgid flag after write */
-       if (err >= 0 && (inode->i_mode & (S_ISUID | S_ISGID))) {
-               struct iattr    ia;
-               ia.ia_valid = ATTR_KILL_SUID | ATTR_KILL_SGID;
-
-               down(&inode->i_sem);
-               notify_change(dentry, &ia);
-               up(&inode->i_sem);
-       }
+       if (err >= 0 && (inode->i_mode & (S_ISUID | S_ISGID)))
+               kill_suid(dentry);
 
        if (err >= 0 && stable) {
                static ino_t    last_ino;