|
|
| version 1.264, 2007/09/19 04:00:15 | version 1.265, 2007/09/25 06:12:37 |
|---|---|
| Line 564 xfs_vn_permission( | Line 564 xfs_vn_permission( |
| STATIC int | STATIC int |
| xfs_vn_getattr( | xfs_vn_getattr( |
| struct vfsmount *mnt, | struct vfsmount *mnt, |
| struct dentry *dentry, | struct dentry *dentry, |
| struct kstat *stat) | struct kstat *stat) |
| { | { |
| struct inode *inode = dentry->d_inode; | struct inode *inode = dentry->d_inode; |
| bhv_vattr_t vattr = { .va_mask = XFS_AT_STAT }; | struct xfs_inode *ip = XFS_I(inode); |
| int error; | struct xfs_mount *mp = ip->i_mount; |
| error = xfs_getattr(XFS_I(inode), &vattr, ATTR_LAZY); | xfs_itrace_entry(ip); |
| if (likely(!error)) { | |
| stat->size = i_size_read(inode); | if (XFS_FORCED_SHUTDOWN(mp)) |
| stat->dev = inode->i_sb->s_dev; | return XFS_ERROR(EIO); |
| stat->rdev = (vattr.va_rdev == 0) ? 0 : | |
| MKDEV(sysv_major(vattr.va_rdev) & 0x1ff, | stat->size = XFS_ISIZE(ip); |
| sysv_minor(vattr.va_rdev)); | stat->dev = inode->i_sb->s_dev; |
| stat->mode = vattr.va_mode; | stat->mode = ip->i_d.di_mode; |
| stat->nlink = vattr.va_nlink; | stat->nlink = ip->i_d.di_nlink; |
| stat->uid = vattr.va_uid; | stat->uid = ip->i_d.di_uid; |
| stat->gid = vattr.va_gid; | stat->gid = ip->i_d.di_gid; |
| stat->ino = vattr.va_nodeid; | stat->ino = ip->i_ino; |
| stat->atime = vattr.va_atime; | #if XFS_BIG_INUMS |
| stat->mtime = vattr.va_mtime; | stat->ino += mp->m_inoadd; |
| stat->ctime = vattr.va_ctime; | #endif |
| stat->blocks = vattr.va_nblocks; | stat->atime = inode->i_atime; |
| stat->blksize = vattr.va_blocksize; | 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 | STATIC int |