patch-2.1.45 linux/kernel/sys.c

Next file: linux/kernel/sysctl.c
Previous file: linux/kernel/ksyms.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.44/linux/kernel/sys.c linux/kernel/sys.c
@@ -21,7 +21,6 @@
 #include <linux/fcntl.h>
 #include <linux/acct.h>
 #include <linux/tty.h>
-#include <linux/nametrans.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/notifier.h>
@@ -397,10 +396,8 @@
       fs = get_fs();
       set_fs(KERNEL_DS);
 
-      acct_file.f_op->write(acct_file.f_inode, &acct_file,
+      acct_file.f_op->write(acct_file.f_dentry->d_inode, &acct_file,
                              (char *)&ac, sizeof(struct acct));
-      /* inode->i_status |= ST_MODIFIED is willingly *not* done here */
-
       set_fs(fs);
    }
    return 0;
@@ -408,8 +405,6 @@
 
 asmlinkage int sys_acct(const char *name)
 {
-	struct inode *inode = (struct inode *)0;
-	char *tmp;
 	int error = -EPERM;
 
 	lock_kernel();
@@ -419,10 +414,10 @@
 	if (name == (char *)0) {
 		if (acct_active) {
 			if (acct_file.f_op->release)
-				acct_file.f_op->release(acct_file.f_inode, &acct_file);
+				acct_file.f_op->release(acct_file.f_dentry->d_inode, &acct_file);
 
-			if (acct_file.f_inode != (struct inode *) 0)
-				iput(acct_file.f_inode);
+			if (acct_file.f_dentry != NULL)
+				dput(acct_file.f_dentry);
 
 			acct_active = 0;
 		}
@@ -430,40 +425,51 @@
 	} else {
 		error = -EBUSY;
 		if (!acct_active) {
-			if ((error = getname(name, &tmp)) != 0)
+			struct dentry *dentry;
+			struct inode *inode;
+			char *tmp;
+
+			tmp = getname(name);
+			error = PTR_ERR(tmp);
+			if (IS_ERR(tmp))
 				goto out;
 
-			error = open_namei(tmp, O_RDWR, 0600, &inode, 0);
+			dentry = open_namei(tmp, O_RDWR, 0600);
 			putname(tmp);
-			if (error)
+
+			error = PTR_ERR(dentry);
+			if (IS_ERR(dentry))
 				goto out;
+			inode = dentry->d_inode;
 
 			error = -EACCES;
 			if (!S_ISREG(inode->i_mode)) {
-				iput(inode);
+				dput(dentry);
 				goto out;
 			}
 
 			error = -EIO;
 			if (!inode->i_op || !inode->i_op->default_file_ops || 
 			    !inode->i_op->default_file_ops->write) {
-				iput(inode);
+				dput(dentry);
 				goto out;
 			}
 
 			acct_file.f_mode = 3;
 			acct_file.f_flags = 0;
 			acct_file.f_count = 1;
-			acct_file.f_inode = inode;
+			acct_file.f_dentry = dentry;
 			acct_file.f_pos = inode->i_size;
 			acct_file.f_reada = 0;
 			acct_file.f_op = inode->i_op->default_file_ops;
 
-			if(acct_file.f_op->open)
-				if(acct_file.f_op->open(acct_file.f_inode, &acct_file)) {
-					iput(inode);
+			if(acct_file.f_op->open) {
+				error = acct_file.f_op->open(inode, &acct_file);
+				if (error) {
+					dput(dentry);
 					goto out;
 				}
+			}
 
 			acct_active = 1;
 			error = 0;

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov