Lines Matching +full:out +full:- +full:volume +full:- +full:limit
1 // SPDX-License-Identifier: GPL-2.0+
29 * nilfs_ioctl_wrap_copy - wrapping function of get/set metadata info
41 * * %-EFAULT - Failure during execution of requested operation.
42 * * %-EINVAL - Invalid arguments from userspace.
43 * * %-ENOMEM - Insufficient memory available.
52 void __user *base = (void __user *)(unsigned long)argv->v_base;
58 if (argv->v_nmembs == 0)
61 if ((size_t)argv->v_size > PAGE_SIZE)
62 return -EINVAL;
65 * Reject pairs of a start item position (argv->v_index) and a
66 * total count (argv->v_nmembs) which leads position 'pos' to
69 if (argv->v_index > ~(__u64)0 - argv->v_nmembs)
70 return -EINVAL;
74 return -ENOMEM;
75 maxmembs = PAGE_SIZE / argv->v_size;
79 pos = argv->v_index;
80 for (i = 0; i < argv->v_nmembs; i += n) {
81 n = (argv->v_nmembs - i < maxmembs) ?
82 argv->v_nmembs - i : maxmembs;
84 copy_from_user(buf, base + argv->v_size * i,
85 argv->v_size * n)) {
86 ret = -EFAULT;
90 nr = dofunc(nilfs, &pos, argv->v_flags, buf, argv->v_size,
97 copy_to_user(base + argv->v_size * i, buf,
98 argv->v_size * nr)) {
99 ret = -EFAULT;
108 argv->v_nmembs = total;
115 * nilfs_fileattr_get - retrieve miscellaneous file attributes
125 fileattr_fill_flags(fa, NILFS_I(inode)->i_flags & FS_FL_USER_VISIBLE);
131 * nilfs_fileattr_set - change miscellaneous file attributes
147 return -EOPNOTSUPP;
149 flags = nilfs_mask_flags(inode->i_mode, fa->flags);
151 ret = nilfs_transaction_begin(inode->i_sb, &ti, 0);
155 oldflags = NILFS_I(inode)->i_flags & ~FS_FL_USER_MODIFIABLE;
156 NILFS_I(inode)->i_flags = oldflags | (flags & FS_FL_USER_MODIFIABLE);
164 return nilfs_transaction_commit(inode->i_sb);
168 * nilfs_ioctl_getversion - get info about a file's version (generation number)
172 * Return: 0 on success, or %-EFAULT on error.
176 return put_user(inode->i_generation, (int __user *)argp);
180 * nilfs_ioctl_change_cpmode - change checkpoint mode (checkpoint/snapshot)
192 * %-EFAULT - Failure during checkpoint mode changing.
193 * %-EPERM - Operation not permitted.
198 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
204 return -EPERM;
210 ret = -EFAULT;
212 goto out;
214 mutex_lock(&nilfs->ns_snapshot_mount_mutex);
216 nilfs_transaction_begin(inode->i_sb, &ti, 0);
218 nilfs->ns_cpfile, cpmode.cm_cno, cpmode.cm_mode);
220 nilfs_transaction_abort(inode->i_sb);
222 nilfs_transaction_commit(inode->i_sb); /* never fails */
224 mutex_unlock(&nilfs->ns_snapshot_mount_mutex);
225 out:
231 * nilfs_ioctl_delete_checkpoint - remove checkpoint
243 * %-EFAULT - Failure during checkpoint removing.
244 * %-EPERM - Operation not permitted.
250 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
256 return -EPERM;
262 ret = -EFAULT;
264 goto out;
266 nilfs_transaction_begin(inode->i_sb, &ti, 0);
267 ret = nilfs_cpfile_delete_checkpoint(nilfs->ns_cpfile, cno);
269 nilfs_transaction_abort(inode->i_sb);
271 nilfs_transaction_commit(inode->i_sb); /* never fails */
272 out:
278 * nilfs_ioctl_do_get_cpinfo - callback method getting info about checkpoints
298 down_read(&nilfs->ns_segctor_sem);
299 ret = nilfs_cpfile_get_cpinfo(nilfs->ns_cpfile, posp, flags, buf,
301 up_read(&nilfs->ns_segctor_sem);
306 * nilfs_ioctl_get_cpstat - get checkpoints statistics
319 * * %-EFAULT - Failure during getting checkpoints statistics.
320 * * %-EIO - I/O error.
321 * * %-ENOMEM - Insufficient memory available.
326 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
330 down_read(&nilfs->ns_segctor_sem);
331 ret = nilfs_cpfile_get_stat(nilfs->ns_cpfile, &cpstat);
332 up_read(&nilfs->ns_segctor_sem);
337 ret = -EFAULT;
342 * nilfs_ioctl_do_get_suinfo - callback method getting segment usage info
363 down_read(&nilfs->ns_segctor_sem);
364 ret = nilfs_sufile_get_suinfo(nilfs->ns_sufile, *posp, buf, size,
366 up_read(&nilfs->ns_segctor_sem);
371 * nilfs_ioctl_get_sustat - get segment usage statistics
384 * * %-EFAULT - Failure during getting segment usage statistics.
385 * * %-EIO - I/O error.
386 * * %-ENOMEM - Insufficient memory available.
391 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
395 down_read(&nilfs->ns_segctor_sem);
396 ret = nilfs_sufile_get_stat(nilfs->ns_sufile, &sustat);
397 up_read(&nilfs->ns_segctor_sem);
402 ret = -EFAULT;
407 * nilfs_ioctl_do_get_vinfo - callback method getting virtual blocks info
428 down_read(&nilfs->ns_segctor_sem);
429 ret = nilfs_dat_get_vinfo(nilfs->ns_dat, buf, size, nmembs);
430 up_read(&nilfs->ns_segctor_sem);
435 * nilfs_ioctl_do_get_bdescs - callback method getting disk block descriptors
454 struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
458 down_read(&nilfs->ns_segctor_sem);
465 if (ret != -ENOENT) {
466 up_read(&nilfs->ns_segctor_sem);
472 up_read(&nilfs->ns_segctor_sem);
477 * nilfs_ioctl_get_bdescs - get disk block descriptors
490 * * %-EFAULT - Failure during getting disk block descriptors.
491 * * %-EINVAL - Invalid arguments from userspace.
492 * * %-EIO - I/O error.
493 * * %-ENOMEM - Insufficient memory available.
498 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
503 return -EFAULT;
506 return -EINVAL;
514 ret = -EFAULT;
519 * nilfs_ioctl_move_inode_block - prepare data/node block for moving by GC
529 * * %-EEXIST - Block conflict detected.
530 * * %-EIO - I/O error.
531 * * %-ENOENT - Requested block doesn't exist.
532 * * %-ENOMEM - Insufficient memory available.
541 if (vdesc->vd_flags == 0)
543 inode, vdesc->vd_offset, vdesc->vd_blocknr,
544 vdesc->vd_vblocknr, &bh);
547 inode, vdesc->vd_blocknr, vdesc->vd_vblocknr, &bh);
550 if (ret == -ENOENT)
551 nilfs_crit(inode->i_sb,
553 __func__, vdesc->vd_flags ? "node" : "data",
554 (unsigned long long)vdesc->vd_ino,
555 (unsigned long long)vdesc->vd_cno,
556 (unsigned long long)vdesc->vd_offset,
557 (unsigned long long)vdesc->vd_blocknr,
558 (unsigned long long)vdesc->vd_vblocknr);
561 if (unlikely(!list_empty(&bh->b_assoc_buffers))) {
562 nilfs_crit(inode->i_sb,
564 __func__, vdesc->vd_flags ? "node" : "data",
565 (unsigned long long)vdesc->vd_ino,
566 (unsigned long long)vdesc->vd_cno,
567 (unsigned long long)vdesc->vd_offset,
568 (unsigned long long)vdesc->vd_blocknr,
569 (unsigned long long)vdesc->vd_vblocknr);
571 return -EEXIST;
573 list_add_tail(&bh->b_assoc_buffers, buffers);
578 * nilfs_ioctl_move_blocks - move valid inode's blocks during garbage collection
593 size_t nmembs = argv->v_nmembs;
594 struct the_nilfs *nilfs = sb->s_fs_info;
604 ino = vdesc->vd_ino;
605 cno = vdesc->vd_cno;
611 if (list_empty(&NILFS_I(inode)->i_dirty)) {
618 list_add(&NILFS_I(inode)->i_dirty,
619 &nilfs->ns_gc_inodes);
631 vdesc->vd_ino == ino && vdesc->vd_cno == cno);
639 WARN_ON(ret == -EEXIST);
642 list_del_init(&bh->b_assoc_buffers);
649 list_del_init(&bh->b_assoc_buffers);
656 * nilfs_ioctl_delete_checkpoints - delete checkpoints
667 * * %-EINVAL - invalid checkpoints.
668 * * %-EIO - I/O error.
669 * * %-ENOMEM - Insufficient memory available.
674 size_t nmembs = argv->v_nmembs;
675 struct inode *cpfile = nilfs->ns_cpfile;
689 * nilfs_ioctl_free_vblocknrs - free virtual block numbers
695 * the virtual block numbers specified by @buf and @argv->v_nmembs.
699 * * %-EIO - I/O error.
700 * * %-ENOENT - Unallocated virtual block number.
701 * * %-ENOMEM - Insufficient memory available.
706 size_t nmembs = argv->v_nmembs;
709 ret = nilfs_dat_freev(nilfs->ns_dat, buf, nmembs);
715 * nilfs_ioctl_mark_blocks_dirty - mark blocks dirty
725 * * %-EIO - I/O error.
726 * * %-ENOENT - Non-existent block (hole block).
727 * * %-ENOMEM - Insufficient memory available.
732 size_t nmembs = argv->v_nmembs;
733 struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
745 if (ret != -ENOENT)
753 ret = nilfs_mdt_get_block(nilfs->ns_dat,
757 WARN_ON(ret == -ENOENT);
761 nilfs_mdt_mark_dirty(nilfs->ns_dat);
767 WARN_ON(ret == -ENOENT);
794 * using a copy-on-write technique.
810 nilfs_err(nilfs->ns_sb, "error %d preparing GC: %s", ret, msg);
815 * nilfs_ioctl_clean_segments - clean segments
846 return -EPERM;
852 ret = -EFAULT;
854 goto out;
856 ret = -EINVAL;
859 goto out;
870 goto out;
872 nilfs = inode->i_sb->s_fs_info;
875 ret = -EINVAL;
879 if (argv[n].v_nmembs > nsegs * nilfs->ns_blocks_per_segment)
894 ret = -ENOMEM;
898 ret = -EFAULT;
910 if (test_and_set_bit(THE_NILFS_GC_RUNNING, &nilfs->ns_flags)) {
911 ret = -EBUSY;
915 ret = nilfs_ioctl_move_blocks(inode->i_sb, &argv[0], kbufs[0]);
917 nilfs_err(inode->i_sb,
923 ret = nilfs_clean_segments(inode->i_sb, argv, kbufs);
930 while (--n >= 0)
933 out:
939 * nilfs_ioctl_sync - make a checkpoint
947 * and metadata are written out to the device when it successfully
952 * * %-EFAULT - Failure during execution of requested operation.
953 * * %-EIO - I/O error.
954 * * %-ENOMEM - Insufficient memory available.
955 * * %-ENOSPC - No space left on device (only in a panic state).
956 * * %-ERESTARTSYS - Interrupted.
957 * * %-EROFS - Read only filesystem.
966 ret = nilfs_construct_segment(inode->i_sb);
970 nilfs = inode->i_sb->s_fs_info;
976 down_read(&nilfs->ns_segctor_sem);
977 cno = nilfs->ns_cno - 1;
978 up_read(&nilfs->ns_segctor_sem);
980 return -EFAULT;
986 * nilfs_ioctl_resize - resize NILFS2 volume
997 int ret = -EPERM;
1000 goto out;
1004 goto out;
1006 ret = -EFAULT;
1010 ret = nilfs_resize_fs(inode->i_sb, newsize);
1014 out:
1019 * nilfs_ioctl_trim_fs() - trim ioctl handle function
1031 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
1036 return -EPERM;
1038 if (!bdev_max_discard_sectors(nilfs->ns_bdev))
1039 return -EOPNOTSUPP;
1042 return -EFAULT;
1045 bdev_discard_granularity(nilfs->ns_bdev));
1047 down_read(&nilfs->ns_segctor_sem);
1048 ret = nilfs_sufile_trim_fs(nilfs->ns_sufile, &range);
1049 up_read(&nilfs->ns_segctor_sem);
1055 return -EFAULT;
1061 * nilfs_ioctl_set_alloc_range - limit range of segments to be allocated
1065 * Description: nilfs_ioctl_set_alloc_range() function defines lower limit
1066 * of segments in bytes and upper limit of segments in bytes.
1073 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
1077 int ret = -EPERM;
1080 goto out;
1082 ret = -EFAULT;
1084 goto out;
1086 ret = -ERANGE;
1087 if (range[1] > bdev_nr_bytes(inode->i_sb->s_bdev))
1088 goto out;
1090 segbytes = nilfs->ns_blocks_per_segment * nilfs->ns_blocksize;
1092 minseg = range[0] + segbytes - 1;
1096 goto out;
1100 goto out;
1103 maxseg--;
1105 ret = nilfs_sufile_set_alloc_range(nilfs->ns_sufile, minseg, maxseg);
1106 out:
1111 * nilfs_ioctl_get_info - wrapping function of get metadata info
1125 * * %-EFAULT - Failure during execution of requested operation.
1126 * * %-EINVAL - Invalid arguments from userspace.
1127 * * %-EIO - I/O error.
1128 * * %-ENOMEM - Insufficient memory available.
1138 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
1143 return -EFAULT;
1146 return -EINVAL;
1153 ret = -EFAULT;
1158 * nilfs_ioctl_set_suinfo - set segment usage info
1170 * * %-EEXIST - Block conflict detected.
1171 * * %-EFAULT - Error copying input data.
1172 * * %-EINVAL - Invalid values in input (segment number, flags or nblocks).
1173 * * %-EIO - I/O error.
1174 * * %-ENOMEM - Insufficient memory available.
1175 * * %-EPERM - Not enough permissions.
1180 struct the_nilfs *nilfs = inode->i_sb->s_fs_info;
1189 return -EPERM;
1195 ret = -EFAULT;
1197 goto out;
1199 ret = -EINVAL;
1201 goto out;
1203 if (argv.v_nmembs > nilfs->ns_nsegments)
1204 goto out;
1207 goto out;
1212 goto out;
1218 ret = -ENOMEM;
1219 goto out;
1223 ret = -EFAULT;
1227 nilfs_transaction_begin(inode->i_sb, &ti, 0);
1228 ret = nilfs_sufile_set_suinfo(nilfs->ns_sufile, kbuf, argv.v_size,
1231 nilfs_transaction_abort(inode->i_sb);
1233 nilfs_transaction_commit(inode->i_sb); /* never fails */
1237 out:
1243 * nilfs_ioctl_get_fslabel - get the volume name of the file system
1245 * @argp: pointer to userspace memory where the volume name should be stored
1247 * Return: 0 on success, %-EFAULT if copying to userspace memory fails.
1251 struct the_nilfs *nilfs = sb->s_fs_info;
1256 down_read(&nilfs->ns_sem);
1257 memtostr_pad(label, nilfs->ns_sbp[0]->s_volume_name);
1258 up_read(&nilfs->ns_sem);
1261 return -EFAULT;
1266 * nilfs_ioctl_set_fslabel - set the volume name of the file system
1269 * @argp: pointer to userspace memory that contains the volume name
1273 * * %-EFAULT - Error copying input data.
1274 * * %-EINVAL - Label length exceeds record size in superblock.
1275 * * %-EIO - I/O error.
1276 * * %-EPERM - Operation not permitted (insufficient permissions).
1277 * * %-EROFS - Read only file system.
1283 struct the_nilfs *nilfs = sb->s_fs_info;
1289 return -EPERM;
1296 ret = -EFAULT;
1304 ret = -EINVAL;
1308 down_write(&nilfs->ns_sem);
1311 ret = -EIO;
1315 strtomem_pad(sbp[0]->s_volume_name, label, 0);
1317 strtomem_pad(sbp[1]->s_volume_name, label, 0);
1322 up_write(&nilfs->ns_sem);
1371 return nilfs_ioctl_get_fslabel(inode->i_sb, argp);
1373 return nilfs_ioctl_set_fslabel(inode->i_sb, filp, argp);
1375 return -ENOTTY;
1404 return -ENOIOCTLCMD;