Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c43f408795c3210c9f5c925e4a49dbb93d41bb57
Commit:     c43f408795c3210c9f5c925e4a49dbb93d41bb57
Parent:     613d70436c1aeda6843ca8b70c7fab6d0484a591
Author:     Christoph Hellwig <[EMAIL PROTECTED]>
AuthorDate: Thu Oct 11 17:46:39 2007 +1000
Committer:  Lachlan McIlroy <[EMAIL PROTECTED]>
CommitDate: Thu Feb 7 16:49:06 2008 +1100

    [XFS] simplify xfs_vn_getattr
    
    Just fill in struct kstat directly from the xfs_inode instead of doing a
    detour through a bhv_vattr_t and xfs_getattr.
    
    SGI-PV: 970980
    SGI-Modid: xfs-linux-melb:xfs-kern:29770a
    
    Signed-off-by: Christoph Hellwig <[EMAIL PROTECTED]>
    Signed-off-by: Lachlan McIlroy <[EMAIL PROTECTED]>
    Signed-off-by: Tim Shimmin <[EMAIL PROTECTED]>
---
 fs/xfs/linux-2.6/xfs_iops.c |   78 +++++++++++++++++++++++++++++--------------
 1 files changed, 53 insertions(+), 25 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
index 204ad23..b5afcfc 100644
--- a/fs/xfs/linux-2.6/xfs_iops.c
+++ b/fs/xfs/linux-2.6/xfs_iops.c
@@ -555,33 +555,61 @@ xfs_vn_permission(
 
 STATIC int
 xfs_vn_getattr(
-       struct vfsmount *mnt,
-       struct dentry   *dentry,
-       struct kstat    *stat)
+       struct vfsmount         *mnt,
+       struct dentry           *dentry,
+       struct kstat            *stat)
 {
-       struct inode    *inode = dentry->d_inode;
-       bhv_vattr_t     vattr = { .va_mask = XFS_AT_STAT };
-       int             error;
-
-       error = xfs_getattr(XFS_I(inode), &vattr, ATTR_LAZY);
-       if (likely(!error)) {
-               stat->size = i_size_read(inode);
-               stat->dev = inode->i_sb->s_dev;
-               stat->rdev = (vattr.va_rdev == 0) ? 0 :
-                               MKDEV(sysv_major(vattr.va_rdev) & 0x1ff,
-                                     sysv_minor(vattr.va_rdev));
-               stat->mode = vattr.va_mode;
-               stat->nlink = vattr.va_nlink;
-               stat->uid = vattr.va_uid;
-               stat->gid = vattr.va_gid;
-               stat->ino = vattr.va_nodeid;
-               stat->atime = vattr.va_atime;
-               stat->mtime = vattr.va_mtime;
-               stat->ctime = vattr.va_ctime;
-               stat->blocks = vattr.va_nblocks;
-               stat->blksize = vattr.va_blocksize;
+       struct inode            *inode = dentry->d_inode;
+       struct xfs_inode        *ip = XFS_I(inode);
+       struct xfs_mount        *mp = ip->i_mount;
+
+       xfs_itrace_entry(ip);
+
+       if (XFS_FORCED_SHUTDOWN(mp))
+               return XFS_ERROR(EIO);
+
+       stat->size = XFS_ISIZE(ip);
+       stat->dev = inode->i_sb->s_dev;
+       stat->mode = ip->i_d.di_mode;
+       stat->nlink = ip->i_d.di_nlink;
+       stat->uid = ip->i_d.di_uid;
+       stat->gid = ip->i_d.di_gid;
+       stat->ino = ip->i_ino;
+#if XFS_BIG_INUMS
+       stat->ino += mp->m_inoadd;
+#endif
+       stat->atime = inode->i_atime;
+       stat->mtime.tv_sec = ip->i_d.di_mtime.t_sec;
+       stat->mtime.tv_nsec = ip->i_d.di_mtime.t_nsec;
+       stat->ctime.tv_sec = ip->i_d.di_ctime.t_sec;
+       stat->ctime.tv_nsec = ip->i_d.di_ctime.t_nsec;
+       stat->blocks =
+               XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
+
+
+       switch (inode->i_mode & S_IFMT) {
+       case S_IFBLK:
+       case S_IFCHR:
+               stat->blksize = BLKDEV_IOSIZE;
+               stat->rdev = MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
+                                  sysv_minor(ip->i_df.if_u2.if_rdev));
+               break;
+       default:
+               if (ip->i_d.di_flags & XFS_DIFLAG_REALTIME) {
+                       /*
+                        * If the file blocks are being allocated from a
+                        * realtime volume, then return the inode's realtime
+                        * extent size or the realtime volume's extent size.
+                        */
+                       stat->blksize =
+                               xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
+               } else
+                       stat->blksize = xfs_preferred_iosize(mp);
+               stat->rdev = 0;
+               break;
        }
-       return -error;
+
+       return 0;
 }
 
 STATIC int
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to