|
@@ -75,132 +75,6 @@ xfs_open(
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * xfs_getattr
|
|
|
- */
|
|
|
-int
|
|
|
-xfs_getattr(
|
|
|
- xfs_inode_t *ip,
|
|
|
- bhv_vattr_t *vap,
|
|
|
- int flags)
|
|
|
-{
|
|
|
- bhv_vnode_t *vp = XFS_ITOV(ip);
|
|
|
- xfs_mount_t *mp = ip->i_mount;
|
|
|
-
|
|
|
- xfs_itrace_entry(ip);
|
|
|
-
|
|
|
- if (XFS_FORCED_SHUTDOWN(mp))
|
|
|
- return XFS_ERROR(EIO);
|
|
|
-
|
|
|
- if (!(flags & ATTR_LAZY))
|
|
|
- xfs_ilock(ip, XFS_ILOCK_SHARED);
|
|
|
-
|
|
|
- vap->va_size = XFS_ISIZE(ip);
|
|
|
- if (vap->va_mask == XFS_AT_SIZE)
|
|
|
- goto all_done;
|
|
|
-
|
|
|
- vap->va_nblocks =
|
|
|
- XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
|
|
|
- vap->va_nodeid = ip->i_ino;
|
|
|
-#if XFS_BIG_INUMS
|
|
|
- vap->va_nodeid += mp->m_inoadd;
|
|
|
-#endif
|
|
|
- vap->va_nlink = ip->i_d.di_nlink;
|
|
|
-
|
|
|
- /*
|
|
|
- * Quick exit for non-stat callers
|
|
|
- */
|
|
|
- if ((vap->va_mask &
|
|
|
- ~(XFS_AT_SIZE|XFS_AT_FSID|XFS_AT_NODEID|
|
|
|
- XFS_AT_NLINK|XFS_AT_BLKSIZE)) == 0)
|
|
|
- goto all_done;
|
|
|
-
|
|
|
- /*
|
|
|
- * Copy from in-core inode.
|
|
|
- */
|
|
|
- vap->va_mode = ip->i_d.di_mode;
|
|
|
- vap->va_uid = ip->i_d.di_uid;
|
|
|
- vap->va_gid = ip->i_d.di_gid;
|
|
|
- vap->va_projid = ip->i_d.di_projid;
|
|
|
-
|
|
|
- /*
|
|
|
- * Check vnode type block/char vs. everything else.
|
|
|
- */
|
|
|
- switch (ip->i_d.di_mode & S_IFMT) {
|
|
|
- case S_IFBLK:
|
|
|
- case S_IFCHR:
|
|
|
- vap->va_rdev = ip->i_df.if_u2.if_rdev;
|
|
|
- vap->va_blocksize = BLKDEV_IOSIZE;
|
|
|
- break;
|
|
|
- default:
|
|
|
- vap->va_rdev = 0;
|
|
|
-
|
|
|
- if (!(XFS_IS_REALTIME_INODE(ip))) {
|
|
|
- vap->va_blocksize = xfs_preferred_iosize(mp);
|
|
|
- } else {
|
|
|
-
|
|
|
- /*
|
|
|
- * If the file blocks are being allocated from a
|
|
|
- * realtime partition, then return the inode's
|
|
|
- * realtime extent size or the realtime volume's
|
|
|
- * extent size.
|
|
|
- */
|
|
|
- vap->va_blocksize =
|
|
|
- xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- vn_atime_to_timespec(vp, &vap->va_atime);
|
|
|
- vap->va_mtime.tv_sec = ip->i_d.di_mtime.t_sec;
|
|
|
- vap->va_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec;
|
|
|
- vap->va_ctime.tv_sec = ip->i_d.di_ctime.t_sec;
|
|
|
- vap->va_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec;
|
|
|
-
|
|
|
- /*
|
|
|
- * Exit for stat callers. See if any of the rest of the fields
|
|
|
- * to be filled in are needed.
|
|
|
- */
|
|
|
- if ((vap->va_mask &
|
|
|
- (XFS_AT_XFLAGS|XFS_AT_EXTSIZE|XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|
|
|
|
- XFS_AT_GENCOUNT|XFS_AT_VCODE)) == 0)
|
|
|
- goto all_done;
|
|
|
-
|
|
|
- /*
|
|
|
- * Convert di_flags to xflags.
|
|
|
- */
|
|
|
- vap->va_xflags = xfs_ip2xflags(ip);
|
|
|
-
|
|
|
- /*
|
|
|
- * Exit for inode revalidate. See if any of the rest of
|
|
|
- * the fields to be filled in are needed.
|
|
|
- */
|
|
|
- if ((vap->va_mask &
|
|
|
- (XFS_AT_EXTSIZE|XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|
|
|
|
- XFS_AT_GENCOUNT|XFS_AT_VCODE)) == 0)
|
|
|
- goto all_done;
|
|
|
-
|
|
|
- vap->va_extsize = ip->i_d.di_extsize << mp->m_sb.sb_blocklog;
|
|
|
- vap->va_nextents =
|
|
|
- (ip->i_df.if_flags & XFS_IFEXTENTS) ?
|
|
|
- ip->i_df.if_bytes / sizeof(xfs_bmbt_rec_t) :
|
|
|
- ip->i_d.di_nextents;
|
|
|
- if (ip->i_afp)
|
|
|
- vap->va_anextents =
|
|
|
- (ip->i_afp->if_flags & XFS_IFEXTENTS) ?
|
|
|
- ip->i_afp->if_bytes / sizeof(xfs_bmbt_rec_t) :
|
|
|
- ip->i_d.di_anextents;
|
|
|
- else
|
|
|
- vap->va_anextents = 0;
|
|
|
- vap->va_gen = ip->i_d.di_gen;
|
|
|
-
|
|
|
- all_done:
|
|
|
- if (!(flags & ATTR_LAZY))
|
|
|
- xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
/*
|
|
|
* xfs_setattr
|
|
|
*/
|