| .. | .. |
|---|
| 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; |
|---|