[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