[Ocfs2-devel] [PATCH] fix the getattr mess

Christoph Hellwig hch at lst.de
Wed Jun 2 12:32:02 CDT 2004


2.4 never calls getattr, so no need to implement it.
In 2.6 use generic_fillattr and avoid tons of useless NULL-checks - if
either of those was true we're in really deep problems and better panic
then papering over it.


Index: src/inode.c
===================================================================
--- src/inode.c	(revision 969)
+++ src/inode.c	(working copy)
@@ -123,16 +125,18 @@
 	.mknod = ocfs_mknod,
 	.rename = ocfs_rename,
 	.setattr = ocfs_setattr,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 	.getattr = ocfs_getattr,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#else
 	.revalidate = ocfs_inode_revalidate,
 #endif
 };
 
 static struct inode_operations ocfs_file_iops = {
 	.setattr = ocfs_setattr,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 	.getattr = ocfs_getattr,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#else
 	.revalidate = ocfs_inode_revalidate,
 #endif
 };
Index: src/file.c
===================================================================
--- src/file.c	(revision 969)
+++ src/file.c	(working copy)
@@ -1489,86 +1489,25 @@
  */
 int ocfs_getattr (struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 {
-	struct inode *inode;
-	struct super_block *sb;
-	ocfs_super *osb;
-	int err = -1;
+	struct inode *inode = dentry->d_inode;
+	struct super_block *sb = dentry->d_inode->i_sb;
+	ocfs_super *osb = ((ocfs_super *) sb->s_fs_info);
+	int err;
 
 	LOG_ENTRY();
 
-	if (!dentry || !stat)
-		goto bail;
-
-	inode = dentry->d_inode;
-	if (!inode)
-		goto bail;
-	sb = dentry->d_inode->i_sb;
-	osb = ((ocfs_super *) sb->s_fs_info);
-
 	err = ocfs_inode_revalidate(dentry);
-	if (err < 0) {
+	if (err) {
 		if (err != -ENOENT)
 			LOG_ERROR_STATUS(err);
 		goto bail;
 	}
 
-	stat->dev = inode->i_sb->s_dev;
-	stat->ino = inode->i_ino;
-	stat->mode = inode->i_mode;
-	stat->nlink = inode->i_nlink;
-	stat->uid = inode->i_uid;
-	stat->gid = inode->i_gid;
-	stat->rdev = inode->i_rdev;
-	stat->atime = inode->i_atime;
-	stat->mtime = inode->i_mtime;
-	stat->ctime = inode->i_ctime;
-	stat->size = inode->i_size;
-	stat->blocks = inode->i_blocks;
-
+	generic_fillattr(inode, stat);
 	/* We set the blksize from the cluster size for performance */
 	stat->blksize = (__u32) osb->vol_layout.cluster_size;
-
-	err = 0;
 bail:
 	LOG_EXIT_INT (err);
 	return err;
-}				/* ocfs_getattr */
-
-#else
-/*
- * ocfs_getattr()
- * THIS FUNCTION IS UNUSED IN 2.4.x
- */
-int ocfs_getattr (struct dentry *dentry, struct iattr *attr)
-{
-	struct inode *inode;
-	int status, needs_trunc = 0;
-	ocfs_super *osb;
-
-	LOG_ENTRY_ARGS ("(0x%p, 0x%p, '%*s')\n", dentry, attr,
-			dentry->d_name.len, dentry->d_name.name);
-
-	inode = dentry->d_inode;
-	if (inode == NULL || !OCFS_I(inode)->open_hndl_cnt)
-		goto bail;
-
-	osb = OCFS_SB(inode->i_sb);
-	if (inode == osb->root_inode)
-		goto bail;
-
-	/* yay, locking hell! Why do we hit disk for this?! */
-	down(&inode->i_sem);
-	down (&(OCFS_I(inode)->priv_sem));
-	status = ocfs_verify_update_inode (osb, inode, &needs_trunc, 0);
-	up (&(OCFS_I(inode)->priv_sem));
-	if (needs_trunc)
-		ocfs_truncate_inode_pages(inode, 0);
-	if (status < 0)
-		LOG_ERROR_STATUS (status);
-	up(&inode->i_sem);
-bail:
-	LOG_EXIT_INT (0);
-	return 0;
-}				/* ocfs_getattr */
+}
 #endif
-


More information about the Ocfs2-devel mailing list