Lines Matching +full:buffered +full:- +full:positive
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
69 f = fdget(hreq->fd); in xfs_find_handle()
71 return -EBADF; in xfs_find_handle()
74 error = user_path_at(AT_FDCWD, hreq->path, 0, &path); in xfs_find_handle()
85 error = -EINVAL; in xfs_find_handle()
86 if (inode->i_sb->s_magic != XFS_SB_MAGIC) in xfs_find_handle()
89 error = -EBADF; in xfs_find_handle()
90 if (!S_ISREG(inode->i_mode) && in xfs_find_handle()
91 !S_ISDIR(inode->i_mode) && in xfs_find_handle()
92 !S_ISLNK(inode->i_mode)) in xfs_find_handle()
96 memcpy(&handle.ha_fsid, ip->i_mount->m_fixedfsid, sizeof(xfs_fsid_t)); in xfs_find_handle()
105 handle.ha_fid.fid_len = sizeof(xfs_fid_t) - in xfs_find_handle()
108 handle.ha_fid.fid_gen = inode->i_generation; in xfs_find_handle()
109 handle.ha_fid.fid_ino = ip->i_ino; in xfs_find_handle()
113 error = -EFAULT; in xfs_find_handle()
114 if (copy_to_user(hreq->ohandle, &handle, hsize) || in xfs_find_handle()
115 copy_to_user(hreq->ohandlen, &hsize, sizeof(__s32))) in xfs_find_handle()
155 if (!S_ISDIR(file_inode(parfilp)->i_mode)) in xfs_handle_to_dentry()
156 return ERR_PTR(-ENOTDIR); in xfs_handle_to_dentry()
159 return ERR_PTR(-EINVAL); in xfs_handle_to_dentry()
161 return ERR_PTR(-EFAULT); in xfs_handle_to_dentry()
163 sizeof(handle.ha_fid) - sizeof(handle.ha_fid.fid_len)) in xfs_handle_to_dentry()
164 return ERR_PTR(-EINVAL); in xfs_handle_to_dentry()
170 return exportfs_decode_fh(parfilp->f_path.mnt, (struct fid *)&fid, 3, in xfs_handle_to_dentry()
180 return xfs_handle_to_dentry(parfilp, hreq->ihandle, hreq->ihandlen); in xfs_handlereq_to_dentry()
199 return -EPERM; in xfs_open_by_handle()
207 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) { in xfs_open_by_handle()
208 error = -EPERM; in xfs_open_by_handle()
213 hreq->oflags |= O_LARGEFILE; in xfs_open_by_handle()
216 permflag = hreq->oflags; in xfs_open_by_handle()
220 error = -EPERM; in xfs_open_by_handle()
225 error = -EPERM; in xfs_open_by_handle()
230 if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) { in xfs_open_by_handle()
231 error = -EISDIR; in xfs_open_by_handle()
241 path.mnt = parfilp->f_path.mnt; in xfs_open_by_handle()
243 filp = dentry_open(&path, hreq->oflags, cred); in xfs_open_by_handle()
250 if (S_ISREG(inode->i_mode)) { in xfs_open_by_handle()
251 filp->f_flags |= O_NOATIME; in xfs_open_by_handle()
252 filp->f_mode |= FMODE_NOCMTIME; in xfs_open_by_handle()
273 return -EPERM; in xfs_readlink_by_handle()
281 error = -EINVAL; in xfs_readlink_by_handle()
285 if (copy_from_user(&olen, hreq->ohandlen, sizeof(__u32))) { in xfs_readlink_by_handle()
286 error = -EFAULT; in xfs_readlink_by_handle()
290 error = vfs_readlink(dentry, hreq->ohandle, olen); in xfs_readlink_by_handle()
310 struct xfs_attrlist *alist = context->buffer; in xfs_ioc_attr_put_listent()
314 ASSERT(!context->seen_enough); in xfs_ioc_attr_put_listent()
315 ASSERT(context->count >= 0); in xfs_ioc_attr_put_listent()
316 ASSERT(context->count < (ATTR_MAX_VALUELEN/8)); in xfs_ioc_attr_put_listent()
317 ASSERT(context->firstu >= sizeof(*alist)); in xfs_ioc_attr_put_listent()
318 ASSERT(context->firstu <= context->bufsize); in xfs_ioc_attr_put_listent()
323 if (context->attr_filter != (flags & XFS_ATTR_NSP_ONDISK_MASK)) in xfs_ioc_attr_put_listent()
327 context->count * sizeof(alist->al_offset[0]); in xfs_ioc_attr_put_listent()
330 context->firstu -= round_up(offsetof(struct xfs_attrlist_ent, a_name) + in xfs_ioc_attr_put_listent()
332 if (context->firstu < arraytop) { in xfs_ioc_attr_put_listent()
334 alist->al_more = 1; in xfs_ioc_attr_put_listent()
335 context->seen_enough = 1; in xfs_ioc_attr_put_listent()
339 aep = context->buffer + context->firstu; in xfs_ioc_attr_put_listent()
340 aep->a_valuelen = valuelen; in xfs_ioc_attr_put_listent()
341 memcpy(aep->a_name, name, namelen); in xfs_ioc_attr_put_listent()
342 aep->a_name[namelen] = 0; in xfs_ioc_attr_put_listent()
343 alist->al_offset[context->count++] = context->firstu; in xfs_ioc_attr_put_listent()
344 alist->al_count = context->count; in xfs_ioc_attr_put_listent()
385 return -EINVAL; in xfs_ioc_attr_list()
391 return -EINVAL; in xfs_ioc_attr_list()
393 return -EINVAL; in xfs_ioc_attr_list()
399 return -EFAULT; in xfs_ioc_attr_list()
401 return -EINVAL; in xfs_ioc_attr_list()
405 return -EINVAL; in xfs_ioc_attr_list()
409 return -ENOMEM; in xfs_ioc_attr_list()
423 alist->al_count = 0; in xfs_ioc_attr_list()
424 alist->al_more = 0; in xfs_ioc_attr_list()
425 alist->al_offset[0] = context.bufsize; in xfs_ioc_attr_list()
433 error = -EFAULT; in xfs_ioc_attr_list()
446 int error = -ENOMEM; in xfs_attrlist_by_handle()
449 return -EPERM; in xfs_attrlist_by_handle()
451 return -EFAULT; in xfs_attrlist_by_handle()
458 al_hreq.buflen, al_hreq.flags, &p->pos); in xfs_attrlist_by_handle()
482 return -EINVAL; in xfs_attrmulti_attr_get()
490 error = -EFAULT; in xfs_attrmulti_attr_get()
515 return -EPERM; in xfs_attrmulti_attr_set()
519 return -EINVAL; in xfs_attrmulti_attr_set()
547 return -EINVAL; in xfs_ioc_attrmulti_one()
569 error = -EINVAL; in xfs_ioc_attrmulti_one()
589 return -EPERM; in xfs_attrmulti_by_handle()
591 return -EFAULT; in xfs_attrmulti_by_handle()
595 return -E2BIG; in xfs_attrmulti_by_handle()
601 error = -E2BIG; in xfs_attrmulti_by_handle()
621 error = -EFAULT; in xfs_attrmulti_by_handle()
641 if (inode->i_flags & (S_IMMUTABLE|S_APPEND)) in xfs_ioc_space()
642 return -EPERM; in xfs_ioc_space()
644 if (!(filp->f_mode & FMODE_WRITE)) in xfs_ioc_space()
645 return -EBADF; in xfs_ioc_space()
647 if (!S_ISREG(inode->i_mode)) in xfs_ioc_space()
648 return -EINVAL; in xfs_ioc_space()
651 return -EOPNOTSUPP; in xfs_ioc_space()
653 if (filp->f_flags & O_DSYNC) in xfs_ioc_space()
655 if (filp->f_mode & FMODE_NOCMTIME) in xfs_ioc_space()
668 switch (bf->l_whence) { in xfs_ioc_space()
672 bf->l_start += filp->f_pos; in xfs_ioc_space()
675 bf->l_start += XFS_ISIZE(ip); in xfs_ioc_space()
678 error = -EINVAL; in xfs_ioc_space()
682 if (bf->l_start < 0 || bf->l_start > inode->i_sb->s_maxbytes) { in xfs_ioc_space()
683 error = -EINVAL; in xfs_ioc_space()
687 if (bf->l_start > XFS_ISIZE(ip)) { in xfs_ioc_space()
689 bf->l_start - XFS_ISIZE(ip), in xfs_ioc_space()
696 iattr.ia_size = bf->l_start; in xfs_ioc_space()
709 /* Return 0 on success or positive error */
717 xfs_bulkstat_to_bstat(breq->mp, &bs1, bstat); in xfs_fsbulkstat_one_fmt()
718 if (copy_to_user(breq->ubuffer, &bs1, sizeof(bs1))) in xfs_fsbulkstat_one_fmt()
719 return -EFAULT; in xfs_fsbulkstat_one_fmt()
731 if (copy_to_user(breq->ubuffer, &ig1, sizeof(struct xfs_inogrp))) in xfs_fsinumbers_fmt()
732 return -EFAULT; in xfs_fsinumbers_fmt()
754 return -EPERM; in xfs_ioc_fsbulkstat()
757 return -EIO; in xfs_ioc_fsbulkstat()
760 return -EFAULT; in xfs_ioc_fsbulkstat()
763 return -EFAULT; in xfs_ioc_fsbulkstat()
766 return -EINVAL; in xfs_ioc_fsbulkstat()
769 return -EINVAL; in xfs_ioc_fsbulkstat()
788 lastino = breq.startino - 1; in xfs_ioc_fsbulkstat()
796 lastino = breq.startino - 1; in xfs_ioc_fsbulkstat()
804 return -EFAULT; in xfs_ioc_fsbulkstat()
808 return -EFAULT; in xfs_ioc_fsbulkstat()
813 /* Return 0 on success or positive error */
819 if (copy_to_user(breq->ubuffer, bstat, sizeof(struct xfs_bulkstat))) in xfs_bulkstat_fmt()
820 return -EFAULT; in xfs_bulkstat_fmt()
827 * should proceed; -ECANCELED if there's nothing to do; or the usual
837 if (hdr->icount == 0 || in xfs_bulk_ireq_setup()
838 (hdr->flags & ~XFS_BULK_IREQ_FLAGS_ALL) || in xfs_bulk_ireq_setup()
839 memchr_inv(hdr->reserved, 0, sizeof(hdr->reserved))) in xfs_bulk_ireq_setup()
840 return -EINVAL; in xfs_bulk_ireq_setup()
842 breq->startino = hdr->ino; in xfs_bulk_ireq_setup()
843 breq->ubuffer = ubuffer; in xfs_bulk_ireq_setup()
844 breq->icount = hdr->icount; in xfs_bulk_ireq_setup()
845 breq->ocount = 0; in xfs_bulk_ireq_setup()
846 breq->flags = 0; in xfs_bulk_ireq_setup()
853 if (hdr->flags & XFS_BULK_IREQ_SPECIAL) { in xfs_bulk_ireq_setup()
854 if (hdr->flags & XFS_BULK_IREQ_AGNO) in xfs_bulk_ireq_setup()
855 return -EINVAL; in xfs_bulk_ireq_setup()
857 switch (hdr->ino) { in xfs_bulk_ireq_setup()
859 hdr->ino = mp->m_sb.sb_rootino; in xfs_bulk_ireq_setup()
862 return -EINVAL; in xfs_bulk_ireq_setup()
864 breq->icount = 1; in xfs_bulk_ireq_setup()
869 * If @hdr->ino is zero, we start iterating in that AG. If @hdr->ino is in xfs_bulk_ireq_setup()
872 if (hdr->flags & XFS_BULK_IREQ_AGNO) { in xfs_bulk_ireq_setup()
873 if (hdr->agno >= mp->m_sb.sb_agcount) in xfs_bulk_ireq_setup()
874 return -EINVAL; in xfs_bulk_ireq_setup()
876 if (breq->startino == 0) in xfs_bulk_ireq_setup()
877 breq->startino = XFS_AGINO_TO_INO(mp, hdr->agno, 0); in xfs_bulk_ireq_setup()
878 else if (XFS_INO_TO_AGNO(mp, breq->startino) < hdr->agno) in xfs_bulk_ireq_setup()
879 return -EINVAL; in xfs_bulk_ireq_setup()
881 breq->flags |= XFS_IBULK_SAME_AG; in xfs_bulk_ireq_setup()
884 if (XFS_INO_TO_AGNO(mp, breq->startino) > hdr->agno) in xfs_bulk_ireq_setup()
885 return -ECANCELED; in xfs_bulk_ireq_setup()
886 } else if (hdr->agno) in xfs_bulk_ireq_setup()
887 return -EINVAL; in xfs_bulk_ireq_setup()
890 if (XFS_INO_TO_AGNO(mp, breq->startino) >= mp->m_sb.sb_agcount) in xfs_bulk_ireq_setup()
891 return -ECANCELED; in xfs_bulk_ireq_setup()
905 hdr->ino = breq->startino; in xfs_bulk_ireq_teardown()
906 hdr->ocount = breq->ocount; in xfs_bulk_ireq_teardown()
923 return -EPERM; in xfs_ioc_bulkstat()
926 return -EIO; in xfs_ioc_bulkstat()
928 if (copy_from_user(&hdr, &arg->hdr, sizeof(hdr))) in xfs_ioc_bulkstat()
929 return -EFAULT; in xfs_ioc_bulkstat()
931 error = xfs_bulk_ireq_setup(mp, &hdr, &breq, arg->bulkstat); in xfs_ioc_bulkstat()
932 if (error == -ECANCELED) in xfs_ioc_bulkstat()
943 if (copy_to_user(&arg->hdr, &hdr, sizeof(hdr))) in xfs_ioc_bulkstat()
944 return -EFAULT; in xfs_ioc_bulkstat()
954 if (copy_to_user(breq->ubuffer, igrp, sizeof(struct xfs_inumbers))) in xfs_inumbers_fmt()
955 return -EFAULT; in xfs_inumbers_fmt()
973 return -EPERM; in xfs_ioc_inumbers()
976 return -EIO; in xfs_ioc_inumbers()
978 if (copy_from_user(&hdr, &arg->hdr, sizeof(hdr))) in xfs_ioc_inumbers()
979 return -EFAULT; in xfs_ioc_inumbers()
981 error = xfs_bulk_ireq_setup(mp, &hdr, &breq, arg->inumbers); in xfs_ioc_inumbers()
982 if (error == -ECANCELED) in xfs_ioc_inumbers()
993 if (copy_to_user(&arg->hdr, &hdr, sizeof(hdr))) in xfs_ioc_inumbers()
994 return -EFAULT; in xfs_ioc_inumbers()
1008 xfs_fs_geometry(&mp->m_sb, &fsgeo, struct_version); in xfs_ioc_fsgeometry()
1020 return -EFAULT; in xfs_ioc_fsgeometry()
1033 return -EFAULT; in xfs_ioc_ag_geometry()
1035 return -EINVAL; in xfs_ioc_ag_geometry()
1037 return -EINVAL; in xfs_ioc_ag_geometry()
1044 return -EFAULT; in xfs_ioc_ag_geometry()
1116 struct xfs_ifork *ifp = attr ? ip->i_afp : &ip->i_df; in xfs_fill_fsxattr()
1119 fa->fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog; in xfs_fill_fsxattr()
1120 fa->fsx_cowextsize = ip->i_d.di_cowextsize << in xfs_fill_fsxattr()
1121 ip->i_mount->m_sb.sb_blocklog; in xfs_fill_fsxattr()
1122 fa->fsx_projid = ip->i_d.di_projid; in xfs_fill_fsxattr()
1123 if (ifp && (ifp->if_flags & XFS_IFEXTENTS)) in xfs_fill_fsxattr()
1124 fa->fsx_nextents = xfs_iext_count(ifp); in xfs_fill_fsxattr()
1126 fa->fsx_nextents = xfs_ifork_nextents(ifp); in xfs_fill_fsxattr()
1142 return -EFAULT; in xfs_ioc_fsgetxattr()
1153 (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC); in xfs_flags2diflags()
1169 if (S_ISDIR(VFS_I(ip)->i_mode)) { in xfs_flags2diflags()
1178 } else if (S_ISREG(VFS_I(ip)->i_mode)) { in xfs_flags2diflags()
1194 (ip->i_d.di_flags2 & (XFS_DIFLAG2_REFLINK | in xfs_flags2diflags2()
1211 struct xfs_mount *mp = ip->i_mount; in xfs_ioctl_setattr_xflags()
1215 if ((ip->i_df.if_nextents || ip->i_delayed_blks) && in xfs_ioctl_setattr_xflags()
1216 XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME)) in xfs_ioctl_setattr_xflags()
1217 return -EINVAL; in xfs_ioctl_setattr_xflags()
1220 if (fa->fsx_xflags & FS_XFLAG_REALTIME) { in xfs_ioctl_setattr_xflags()
1221 if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 || in xfs_ioctl_setattr_xflags()
1222 (ip->i_d.di_extsize % mp->m_sb.sb_rextsize)) in xfs_ioctl_setattr_xflags()
1223 return -EINVAL; in xfs_ioctl_setattr_xflags()
1227 if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip)) in xfs_ioctl_setattr_xflags()
1228 ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; in xfs_ioctl_setattr_xflags()
1231 if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip)) in xfs_ioctl_setattr_xflags()
1232 return -EINVAL; in xfs_ioctl_setattr_xflags()
1235 di_flags2 = xfs_flags2diflags2(ip, fa->fsx_xflags); in xfs_ioctl_setattr_xflags()
1236 if (di_flags2 && !xfs_sb_version_has_v3inode(&mp->m_sb)) in xfs_ioctl_setattr_xflags()
1237 return -EINVAL; in xfs_ioctl_setattr_xflags()
1239 ip->i_d.di_flags = xfs_flags2diflags(ip, fa->fsx_xflags); in xfs_ioctl_setattr_xflags()
1240 ip->i_d.di_flags2 = di_flags2; in xfs_ioctl_setattr_xflags()
1254 struct xfs_mount *mp = ip->i_mount; in xfs_ioctl_setattr_prepare_dax()
1257 if (S_ISDIR(inode->i_mode)) in xfs_ioctl_setattr_prepare_dax()
1260 if ((mp->m_flags & XFS_MOUNT_DAX_ALWAYS) || in xfs_ioctl_setattr_prepare_dax()
1261 (mp->m_flags & XFS_MOUNT_DAX_NEVER)) in xfs_ioctl_setattr_prepare_dax()
1264 if (((fa->fsx_xflags & FS_XFLAG_DAX) && in xfs_ioctl_setattr_prepare_dax()
1265 !(ip->i_d.di_flags2 & XFS_DIFLAG2_DAX)) || in xfs_ioctl_setattr_prepare_dax()
1266 (!(fa->fsx_xflags & FS_XFLAG_DAX) && in xfs_ioctl_setattr_prepare_dax()
1267 (ip->i_d.di_flags2 & XFS_DIFLAG2_DAX))) in xfs_ioctl_setattr_prepare_dax()
1281 struct xfs_mount *mp = ip->i_mount; in xfs_ioctl_setattr_get_trans()
1283 int error = -EROFS; in xfs_ioctl_setattr_get_trans()
1285 if (mp->m_flags & XFS_MOUNT_RDONLY) in xfs_ioctl_setattr_get_trans()
1287 error = -EIO; in xfs_ioctl_setattr_get_trans()
1291 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); in xfs_ioctl_setattr_get_trans()
1305 error = -EPERM; in xfs_ioctl_setattr_get_trans()
1309 if (mp->m_flags & XFS_MOUNT_WSYNC) in xfs_ioctl_setattr_get_trans()
1330 * 8. for non-realtime files, the extent size hint must be limited
1341 struct xfs_mount *mp = ip->i_mount; in xfs_ioctl_setattr_check_extsize()
1345 if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_df.if_nextents && in xfs_ioctl_setattr_check_extsize()
1346 ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize)) in xfs_ioctl_setattr_check_extsize()
1347 return -EINVAL; in xfs_ioctl_setattr_check_extsize()
1349 if (fa->fsx_extsize == 0) in xfs_ioctl_setattr_check_extsize()
1352 extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize); in xfs_ioctl_setattr_check_extsize()
1354 return -EINVAL; in xfs_ioctl_setattr_check_extsize()
1357 (fa->fsx_xflags & FS_XFLAG_REALTIME)) { in xfs_ioctl_setattr_check_extsize()
1358 size = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog; in xfs_ioctl_setattr_check_extsize()
1360 size = mp->m_sb.sb_blocksize; in xfs_ioctl_setattr_check_extsize()
1361 if (extsize_fsb > mp->m_sb.sb_agblocks / 2) in xfs_ioctl_setattr_check_extsize()
1362 return -EINVAL; in xfs_ioctl_setattr_check_extsize()
1365 if (fa->fsx_extsize % size) in xfs_ioctl_setattr_check_extsize()
1366 return -EINVAL; in xfs_ioctl_setattr_check_extsize()
1391 struct xfs_mount *mp = ip->i_mount; in xfs_ioctl_setattr_check_cowextsize()
1395 if (!(fa->fsx_xflags & FS_XFLAG_COWEXTSIZE)) in xfs_ioctl_setattr_check_cowextsize()
1398 if (!xfs_sb_version_hasreflink(&ip->i_mount->m_sb)) in xfs_ioctl_setattr_check_cowextsize()
1399 return -EINVAL; in xfs_ioctl_setattr_check_cowextsize()
1401 if (fa->fsx_cowextsize == 0) in xfs_ioctl_setattr_check_cowextsize()
1404 cowextsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_cowextsize); in xfs_ioctl_setattr_check_cowextsize()
1406 return -EINVAL; in xfs_ioctl_setattr_check_cowextsize()
1408 size = mp->m_sb.sb_blocksize; in xfs_ioctl_setattr_check_cowextsize()
1409 if (cowextsize_fsb > mp->m_sb.sb_agblocks / 2) in xfs_ioctl_setattr_check_cowextsize()
1410 return -EINVAL; in xfs_ioctl_setattr_check_cowextsize()
1412 if (fa->fsx_cowextsize % size) in xfs_ioctl_setattr_check_cowextsize()
1413 return -EINVAL; in xfs_ioctl_setattr_check_cowextsize()
1424 if (fa->fsx_projid > (uint16_t)-1 && in xfs_ioctl_setattr_check_projid()
1425 !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb)) in xfs_ioctl_setattr_check_projid()
1426 return -EINVAL; in xfs_ioctl_setattr_check_projid()
1436 struct xfs_mount *mp = ip->i_mount; in xfs_ioctl_setattr()
1457 code = xfs_qm_vop_dqalloc(ip, VFS_I(ip)->i_uid, in xfs_ioctl_setattr()
1458 VFS_I(ip)->i_gid, fa->fsx_projid, in xfs_ioctl_setattr()
1473 ip->i_d.di_projid != fa->fsx_projid) { in xfs_ioctl_setattr()
1501 * The set-user-ID and set-group-ID bits of a file will be cleared upon in xfs_ioctl_setattr()
1505 if ((VFS_I(ip)->i_mode & (S_ISUID|S_ISGID)) && in xfs_ioctl_setattr()
1507 VFS_I(ip)->i_mode &= ~(S_ISUID|S_ISGID); in xfs_ioctl_setattr()
1510 if (ip->i_d.di_projid != fa->fsx_projid) { in xfs_ioctl_setattr()
1513 &ip->i_pdquot, pdqp); in xfs_ioctl_setattr()
1515 ip->i_d.di_projid = fa->fsx_projid; in xfs_ioctl_setattr()
1523 if (ip->i_d.di_flags & (XFS_DIFLAG_EXTSIZE | XFS_DIFLAG_EXTSZINHERIT)) in xfs_ioctl_setattr()
1524 ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog; in xfs_ioctl_setattr()
1526 ip->i_d.di_extsize = 0; in xfs_ioctl_setattr()
1527 if (xfs_sb_version_has_v3inode(&mp->m_sb) && in xfs_ioctl_setattr()
1528 (ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE)) in xfs_ioctl_setattr()
1529 ip->i_d.di_cowextsize = fa->fsx_cowextsize >> in xfs_ioctl_setattr()
1530 mp->m_sb.sb_blocklog; in xfs_ioctl_setattr()
1532 ip->i_d.di_cowextsize = 0; in xfs_ioctl_setattr()
1561 return -EFAULT; in xfs_ioc_fssetxattr()
1578 flags = xfs_di2lxflags(ip->i_d.di_flags, ip->i_d.di_flags2); in xfs_ioc_getxflags()
1580 return -EFAULT; in xfs_ioc_getxflags()
1597 return -EFAULT; in xfs_ioc_setxflags()
1602 return -EOPNOTSUPP; in xfs_ioc_setxflags()
1643 if (put_user(p->bmv_offset, &u->bmv_offset) || in xfs_getbmap_format()
1644 put_user(p->bmv_block, &u->bmv_block) || in xfs_getbmap_format()
1645 put_user(p->bmv_length, &u->bmv_length) || in xfs_getbmap_format()
1646 put_user(0, &u->bmv_count) || in xfs_getbmap_format()
1647 put_user(0, &u->bmv_entries)) in xfs_getbmap_format()
1651 if (put_user(0, &u->bmv_iflags) || in xfs_getbmap_format()
1652 put_user(p->bmv_oflags, &u->bmv_oflags) || in xfs_getbmap_format()
1653 put_user(0, &u->bmv_unused1) || in xfs_getbmap_format()
1654 put_user(0, &u->bmv_unused2)) in xfs_getbmap_format()
1675 if (file->f_mode & FMODE_NOCMTIME) in xfs_ioc_getbmap()
1684 return -EINVAL; in xfs_ioc_getbmap()
1688 return -EFAULT; in xfs_ioc_getbmap()
1691 return -EINVAL; in xfs_ioc_getbmap()
1693 return -ENOMEM; in xfs_ioc_getbmap()
1697 return -ENOMEM; in xfs_ioc_getbmap()
1703 error = -EFAULT; in xfs_ioc_getbmap()
1734 return -EFAULT; in xfs_ioc_getfsmap()
1740 return -EINVAL; in xfs_ioc_getfsmap()
1755 return -ENOMEM; in xfs_ioc_getfsmap()
1762 trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]); in xfs_ioc_getfsmap()
1763 trace_xfs_getfsmap_high_key(ip->i_mount, &xhead.fmh_keys[1]); in xfs_ioc_getfsmap()
1770 user_recs = &arg->fmh_recs[head.fmh_entries]; in xfs_ioc_getfsmap()
1773 head.fmh_count - head.fmh_entries); in xfs_ioc_getfsmap()
1776 error = xfs_getfsmap(ip->i_mount, &xhead, recs); in xfs_ioc_getfsmap()
1785 case -ECANCELED: in xfs_ioc_getfsmap()
1809 error = -EFAULT; in xfs_ioc_getfsmap()
1814 last_rec = &recs[xhead.fmh_entries - 1]; in xfs_ioc_getfsmap()
1815 last_flags = last_rec->fmr_flags; in xfs_ioc_getfsmap()
1819 trace_xfs_getfsmap_low_key(ip->i_mount, &xhead.fmh_keys[0]); in xfs_ioc_getfsmap()
1830 user_rec = &arg->fmh_recs[head.fmh_entries - 1]; in xfs_ioc_getfsmap()
1832 if (copy_to_user(&user_rec->fmr_flags, &last_flags, in xfs_ioc_getfsmap()
1834 error = -EFAULT; in xfs_ioc_getfsmap()
1841 error = -EFAULT; in xfs_ioc_getfsmap()
1859 return -EPERM; in xfs_ioc_scrub_metadata()
1862 return -EFAULT; in xfs_ioc_scrub_metadata()
1869 return -EFAULT; in xfs_ioc_scrub_metadata()
1883 f = fdget((int)sxp->sx_fdtarget); in xfs_ioc_swapext()
1885 error = -EINVAL; in xfs_ioc_swapext()
1889 if (!(f.file->f_mode & FMODE_WRITE) || in xfs_ioc_swapext()
1890 !(f.file->f_mode & FMODE_READ) || in xfs_ioc_swapext()
1891 (f.file->f_flags & O_APPEND)) { in xfs_ioc_swapext()
1892 error = -EBADF; in xfs_ioc_swapext()
1896 tmp = fdget((int)sxp->sx_fdtmp); in xfs_ioc_swapext()
1898 error = -EINVAL; in xfs_ioc_swapext()
1902 if (!(tmp.file->f_mode & FMODE_WRITE) || in xfs_ioc_swapext()
1903 !(tmp.file->f_mode & FMODE_READ) || in xfs_ioc_swapext()
1904 (tmp.file->f_flags & O_APPEND)) { in xfs_ioc_swapext()
1905 error = -EBADF; in xfs_ioc_swapext()
1911 error = -EINVAL; in xfs_ioc_swapext()
1920 if (f.file->f_op != &xfs_file_operations || in xfs_ioc_swapext()
1921 tmp.file->f_op != &xfs_file_operations) { in xfs_ioc_swapext()
1922 error = -EINVAL; in xfs_ioc_swapext()
1929 if (ip->i_mount != tip->i_mount) { in xfs_ioc_swapext()
1930 error = -EINVAL; in xfs_ioc_swapext()
1934 if (ip->i_ino == tip->i_ino) { in xfs_ioc_swapext()
1935 error = -EINVAL; in xfs_ioc_swapext()
1939 if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { in xfs_ioc_swapext()
1940 error = -EIO; in xfs_ioc_swapext()
1959 struct xfs_sb *sbp = &mp->m_sb; in xfs_ioc_getlabel()
1963 BUILD_BUG_ON(sizeof(sbp->sb_fname) > FSLABEL_MAX); in xfs_ioc_getlabel()
1967 spin_lock(&mp->m_sb_lock); in xfs_ioc_getlabel()
1968 strncpy(label, sbp->sb_fname, XFSLABEL_MAX); in xfs_ioc_getlabel()
1969 spin_unlock(&mp->m_sb_lock); in xfs_ioc_getlabel()
1972 return -EFAULT; in xfs_ioc_getlabel()
1982 struct xfs_sb *sbp = &mp->m_sb; in xfs_ioc_setlabel()
1988 return -EPERM; in xfs_ioc_setlabel()
1996 return -EFAULT; in xfs_ioc_setlabel()
1998 if (len > sizeof(sbp->sb_fname)) in xfs_ioc_setlabel()
1999 return -EINVAL; in xfs_ioc_setlabel()
2005 spin_lock(&mp->m_sb_lock); in xfs_ioc_setlabel()
2006 memset(sbp->sb_fname, 0, sizeof(sbp->sb_fname)); in xfs_ioc_setlabel()
2007 memcpy(sbp->sb_fname, label, len); in xfs_ioc_setlabel()
2008 spin_unlock(&mp->m_sb_lock); in xfs_ioc_setlabel()
2016 * buffered reads from userspace (i.e. from blkid) are invalidated, in xfs_ioc_setlabel()
2017 * and userspace will see the newly-written label. in xfs_ioc_setlabel()
2025 mutex_lock(&mp->m_growlock); in xfs_ioc_setlabel()
2027 mutex_unlock(&mp->m_growlock); in xfs_ioc_setlabel()
2029 invalidate_bdev(mp->m_ddev_targp->bt_bdev); in xfs_ioc_setlabel()
2041 if (src->eof_version != XFS_EOFBLOCKS_VERSION) in xfs_fs_eofblocks_from_user()
2042 return -EINVAL; in xfs_fs_eofblocks_from_user()
2044 if (src->eof_flags & ~XFS_EOF_FLAGS_VALID) in xfs_fs_eofblocks_from_user()
2045 return -EINVAL; in xfs_fs_eofblocks_from_user()
2047 if (memchr_inv(&src->pad32, 0, sizeof(src->pad32)) || in xfs_fs_eofblocks_from_user()
2048 memchr_inv(src->pad64, 0, sizeof(src->pad64))) in xfs_fs_eofblocks_from_user()
2049 return -EINVAL; in xfs_fs_eofblocks_from_user()
2051 dst->eof_flags = src->eof_flags; in xfs_fs_eofblocks_from_user()
2052 dst->eof_prid = src->eof_prid; in xfs_fs_eofblocks_from_user()
2053 dst->eof_min_file_size = src->eof_min_file_size; in xfs_fs_eofblocks_from_user()
2055 dst->eof_uid = INVALID_UID; in xfs_fs_eofblocks_from_user()
2056 if (src->eof_flags & XFS_EOF_FLAGS_UID) { in xfs_fs_eofblocks_from_user()
2057 dst->eof_uid = make_kuid(current_user_ns(), src->eof_uid); in xfs_fs_eofblocks_from_user()
2058 if (!uid_valid(dst->eof_uid)) in xfs_fs_eofblocks_from_user()
2059 return -EINVAL; in xfs_fs_eofblocks_from_user()
2062 dst->eof_gid = INVALID_GID; in xfs_fs_eofblocks_from_user()
2063 if (src->eof_flags & XFS_EOF_FLAGS_GID) { in xfs_fs_eofblocks_from_user()
2064 dst->eof_gid = make_kgid(current_user_ns(), src->eof_gid); in xfs_fs_eofblocks_from_user()
2065 if (!gid_valid(dst->eof_gid)) in xfs_fs_eofblocks_from_user()
2066 return -EINVAL; in xfs_fs_eofblocks_from_user()
2072 * Note: some of the ioctl's return positive numbers as a
2085 struct xfs_mount *mp = ip->i_mount; in xfs_file_ioctl()
2105 return -EFAULT; in xfs_file_ioctl()
2112 da.d_mem = da.d_miniosz = target->bt_logical_sectorsize; in xfs_file_ioctl()
2113 da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); in xfs_file_ioctl()
2116 return -EFAULT; in xfs_file_ioctl()
2141 return put_user(inode->i_generation, (int __user *)arg); in xfs_file_ioctl()
2171 return -EFAULT; in xfs_file_ioctl()
2178 return -EFAULT; in xfs_file_ioctl()
2186 return -EFAULT; in xfs_file_ioctl()
2199 return -EFAULT; in xfs_file_ioctl()
2214 return -EFAULT; in xfs_file_ioctl()
2223 return -EPERM; in xfs_file_ioctl()
2225 if (mp->m_flags & XFS_MOUNT_RDONLY) in xfs_file_ioctl()
2226 return -EROFS; in xfs_file_ioctl()
2229 return -EFAULT; in xfs_file_ioctl()
2243 return -EFAULT; in xfs_file_ioctl()
2251 return -EPERM; in xfs_file_ioctl()
2258 return -EFAULT; in xfs_file_ioctl()
2267 return -EFAULT; in xfs_file_ioctl()
2281 return -EFAULT; in xfs_file_ioctl()
2295 return -EFAULT; in xfs_file_ioctl()
2309 return -EPERM; in xfs_file_ioctl()
2312 return -EFAULT; in xfs_file_ioctl()
2321 return -EPERM; in xfs_file_ioctl()
2324 return -EFAULT; in xfs_file_ioctl()
2331 return -EPERM; in xfs_file_ioctl()
2340 return -EPERM; in xfs_file_ioctl()
2342 if (mp->m_flags & XFS_MOUNT_RDONLY) in xfs_file_ioctl()
2343 return -EROFS; in xfs_file_ioctl()
2346 return -EFAULT; in xfs_file_ioctl()
2352 sb_start_write(mp->m_super); in xfs_file_ioctl()
2354 sb_end_write(mp->m_super); in xfs_file_ioctl()
2359 return -ENOTTY; in xfs_file_ioctl()