int xfs_sb_version_hasshared(xfs_sb_t *sbp) { return XFS_SB_VERSION_HASSHARED(sbp); }
/* * This function fills in xfs_mount_t fields based on mount args. * Note: the superblock _has_ now been read in. */ STATIC int xfs_finish_flags( struct vfs *vfs, struct xfs_mount_args *ap, struct xfs_mount *mp) { int ronly = (vfs->vfs_flag & VFS_RDONLY); /* Fail a mount where the logbuf is smaller then the log stripe */ if (XFS_SB_VERSION_HASLOGV2(&mp->m_sb)) { if ((ap->logbufsize == -1) && (mp->m_sb.sb_logsunit > XLOG_BIG_RECORD_BSIZE)) { mp->m_logbsize = mp->m_sb.sb_logsunit; } else if (ap->logbufsize < mp->m_sb.sb_logsunit) { cmn_err(CE_WARN, "XFS: logbuf size must be greater than or equal to log stripe size"); return XFS_ERROR(EINVAL); } } else { /* Fail a mount if the logbuf is larger than 32K */ if (ap->logbufsize > XLOG_BIG_RECORD_BSIZE) { cmn_err(CE_WARN, "XFS: logbuf size for version 1 logs must be 16K or 32K"); return XFS_ERROR(EINVAL); } } /* * prohibit r/w mounts of read-only filesystems */ if ((mp->m_sb.sb_flags & XFS_SBF_READONLY) && !ronly) { cmn_err(CE_WARN, "XFS: cannot mount a read-only filesystem as read-write"); return XFS_ERROR(EROFS); } /* * disallow mount attempts with (IRIX) project quota enabled */ if (XFS_SB_VERSION_HASQUOTA(&mp->m_sb) && (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT)) { cmn_err(CE_WARN, "XFS: cannot mount a filesystem with IRIX project quota enabled"); return XFS_ERROR(ENOSYS); } /* * check for shared mount. */ if (ap->flags & XFSMNT_SHARED) { if (!XFS_SB_VERSION_HASSHARED(&mp->m_sb)) return XFS_ERROR(EINVAL); /* * For IRIX 6.5, shared mounts must have the shared * version bit set, have the persistent readonly * field set, must be version 0 and can only be mounted * read-only. */ if (!ronly || !(mp->m_sb.sb_flags & XFS_SBF_READONLY) || (mp->m_sb.sb_shared_vn != 0)) return XFS_ERROR(EINVAL); mp->m_flags |= XFS_MOUNT_SHARED; /* * Shared XFS V0 can't deal with DMI. Return EINVAL. */ if (mp->m_sb.sb_shared_vn == 0 && (ap->flags & XFSMNT_DMAPI)) return XFS_ERROR(EINVAL); } return 0; }