.. | .. |
---|
70 | 70 | if (argv->v_index > ~(__u64)0 - argv->v_nmembs) |
---|
71 | 71 | return -EINVAL; |
---|
72 | 72 | |
---|
73 | | - buf = (void *)__get_free_pages(GFP_NOFS, 0); |
---|
| 73 | + buf = (void *)get_zeroed_page(GFP_NOFS); |
---|
74 | 74 | if (unlikely(!buf)) |
---|
75 | 75 | return -ENOMEM; |
---|
76 | 76 | maxmembs = PAGE_SIZE / argv->v_size; |
---|
.. | .. |
---|
148 | 148 | |
---|
149 | 149 | oldflags = NILFS_I(inode)->i_flags; |
---|
150 | 150 | |
---|
151 | | - /* |
---|
152 | | - * The IMMUTABLE and APPEND_ONLY flags can only be changed by the |
---|
153 | | - * relevant capability. |
---|
154 | | - */ |
---|
155 | | - ret = -EPERM; |
---|
156 | | - if (((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) && |
---|
157 | | - !capable(CAP_LINUX_IMMUTABLE)) |
---|
| 151 | + ret = vfs_ioc_setflags_prepare(inode, oldflags, flags); |
---|
| 152 | + if (ret) |
---|
158 | 153 | goto out; |
---|
159 | 154 | |
---|
160 | 155 | ret = nilfs_transaction_begin(inode->i_sb, &ti, 0); |
---|
.. | .. |
---|
574 | 569 | |
---|
575 | 570 | if (unlikely(ret < 0)) { |
---|
576 | 571 | if (ret == -ENOENT) |
---|
577 | | - nilfs_msg(inode->i_sb, KERN_CRIT, |
---|
578 | | - "%s: invalid virtual block address (%s): ino=%llu, cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu", |
---|
579 | | - __func__, vdesc->vd_flags ? "node" : "data", |
---|
580 | | - (unsigned long long)vdesc->vd_ino, |
---|
581 | | - (unsigned long long)vdesc->vd_cno, |
---|
582 | | - (unsigned long long)vdesc->vd_offset, |
---|
583 | | - (unsigned long long)vdesc->vd_blocknr, |
---|
584 | | - (unsigned long long)vdesc->vd_vblocknr); |
---|
| 572 | + nilfs_crit(inode->i_sb, |
---|
| 573 | + "%s: invalid virtual block address (%s): ino=%llu, cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu", |
---|
| 574 | + __func__, vdesc->vd_flags ? "node" : "data", |
---|
| 575 | + (unsigned long long)vdesc->vd_ino, |
---|
| 576 | + (unsigned long long)vdesc->vd_cno, |
---|
| 577 | + (unsigned long long)vdesc->vd_offset, |
---|
| 578 | + (unsigned long long)vdesc->vd_blocknr, |
---|
| 579 | + (unsigned long long)vdesc->vd_vblocknr); |
---|
585 | 580 | return ret; |
---|
586 | 581 | } |
---|
587 | 582 | if (unlikely(!list_empty(&bh->b_assoc_buffers))) { |
---|
588 | | - nilfs_msg(inode->i_sb, KERN_CRIT, |
---|
589 | | - "%s: conflicting %s buffer: ino=%llu, cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu", |
---|
590 | | - __func__, vdesc->vd_flags ? "node" : "data", |
---|
591 | | - (unsigned long long)vdesc->vd_ino, |
---|
592 | | - (unsigned long long)vdesc->vd_cno, |
---|
593 | | - (unsigned long long)vdesc->vd_offset, |
---|
594 | | - (unsigned long long)vdesc->vd_blocknr, |
---|
595 | | - (unsigned long long)vdesc->vd_vblocknr); |
---|
| 583 | + nilfs_crit(inode->i_sb, |
---|
| 584 | + "%s: conflicting %s buffer: ino=%llu, cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu", |
---|
| 585 | + __func__, vdesc->vd_flags ? "node" : "data", |
---|
| 586 | + (unsigned long long)vdesc->vd_ino, |
---|
| 587 | + (unsigned long long)vdesc->vd_cno, |
---|
| 588 | + (unsigned long long)vdesc->vd_offset, |
---|
| 589 | + (unsigned long long)vdesc->vd_blocknr, |
---|
| 590 | + (unsigned long long)vdesc->vd_vblocknr); |
---|
596 | 591 | brelse(bh); |
---|
597 | 592 | return -EEXIST; |
---|
598 | 593 | } |
---|
.. | .. |
---|
842 | 837 | return 0; |
---|
843 | 838 | |
---|
844 | 839 | failed: |
---|
845 | | - nilfs_msg(nilfs->ns_sb, KERN_ERR, "error %d preparing GC: %s", ret, |
---|
846 | | - msg); |
---|
| 840 | + nilfs_err(nilfs->ns_sb, "error %d preparing GC: %s", ret, msg); |
---|
847 | 841 | return ret; |
---|
848 | 842 | } |
---|
849 | 843 | |
---|
.. | .. |
---|
952 | 946 | |
---|
953 | 947 | ret = nilfs_ioctl_move_blocks(inode->i_sb, &argv[0], kbufs[0]); |
---|
954 | 948 | if (ret < 0) { |
---|
955 | | - nilfs_msg(inode->i_sb, KERN_ERR, |
---|
| 949 | + nilfs_err(inode->i_sb, |
---|
956 | 950 | "error %d preparing GC: cannot read source blocks", |
---|
957 | 951 | ret); |
---|
958 | 952 | } else { |
---|
.. | .. |
---|
1135 | 1129 | |
---|
1136 | 1130 | minseg = range[0] + segbytes - 1; |
---|
1137 | 1131 | do_div(minseg, segbytes); |
---|
| 1132 | + |
---|
| 1133 | + if (range[1] < 4096) |
---|
| 1134 | + goto out; |
---|
| 1135 | + |
---|
1138 | 1136 | maxseg = NILFS_SB2_OFFSET_BYTES(range[1]); |
---|
| 1137 | + if (maxseg < segbytes) |
---|
| 1138 | + goto out; |
---|
| 1139 | + |
---|
1139 | 1140 | do_div(maxseg, segbytes); |
---|
1140 | 1141 | maxseg--; |
---|
1141 | 1142 | |
---|
.. | .. |
---|
1359 | 1360 | case NILFS_IOCTL_SYNC: |
---|
1360 | 1361 | case NILFS_IOCTL_RESIZE: |
---|
1361 | 1362 | case NILFS_IOCTL_SET_ALLOC_RANGE: |
---|
| 1363 | + case FITRIM: |
---|
1362 | 1364 | break; |
---|
1363 | 1365 | default: |
---|
1364 | 1366 | return -ENOIOCTLCMD; |
---|