vfs.c (a2f4c3fa4db94ba44d32a72201927cfd132a8e82) vfs.c (3988a57885eeac05ef89f0ab4d7e47b52fbcf630)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * File operations used by nfsd. Some of these have been ripped from
4 * other parts of the kernel because they weren't exported, others
5 * are partial duplicates with added or changed functionality.
6 *
7 * Note that several functions dget() the dentry upon which they want
8 * to act, most notably those that create directory entries. Response

--- 545 unchanged lines hidden (view full) ---

554 status = commit_inode_metadata(file_inode(src));
555 if (status < 0) {
556 trace_nfsd_clone_file_range_err(rqstp,
557 &nfsd4_get_cstate(rqstp)->save_fh,
558 src_pos,
559 &nfsd4_get_cstate(rqstp)->current_fh,
560 dst_pos,
561 count, status);
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * File operations used by nfsd. Some of these have been ripped from
4 * other parts of the kernel because they weren't exported, others
5 * are partial duplicates with added or changed functionality.
6 *
7 * Note that several functions dget() the dentry upon which they want
8 * to act, most notably those that create directory entries. Response

--- 545 unchanged lines hidden (view full) ---

554 status = commit_inode_metadata(file_inode(src));
555 if (status < 0) {
556 trace_nfsd_clone_file_range_err(rqstp,
557 &nfsd4_get_cstate(rqstp)->save_fh,
558 src_pos,
559 &nfsd4_get_cstate(rqstp)->current_fh,
560 dst_pos,
561 count, status);
562 nfsd_reset_boot_verifier(net_generic(nf_dst->nf_net,
563 nfsd_net_id));
562 nfsd_reset_write_verifier(net_generic(nf_dst->nf_net,
563 nfsd_net_id));
564 ret = nfserrno(status);
565 }
566 }
567out_err:
568 return ret;
569}
570
571ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst,

--- 436 unchanged lines hidden (view full) ---

1008 stable = NFS_UNSTABLE;
1009
1010 if (stable && !use_wgather)
1011 flags |= RWF_SYNC;
1012
1013 iov_iter_kvec(&iter, WRITE, vec, vlen, *cnt);
1014 since = READ_ONCE(file->f_wb_err);
1015 if (verf)
564 ret = nfserrno(status);
565 }
566 }
567out_err:
568 return ret;
569}
570
571ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst,

--- 436 unchanged lines hidden (view full) ---

1008 stable = NFS_UNSTABLE;
1009
1010 if (stable && !use_wgather)
1011 flags |= RWF_SYNC;
1012
1013 iov_iter_kvec(&iter, WRITE, vec, vlen, *cnt);
1014 since = READ_ONCE(file->f_wb_err);
1015 if (verf)
1016 nfsd_copy_boot_verifier(verf, nn);
1016 nfsd_copy_write_verifier(verf, nn);
1017 host_err = vfs_iter_write(file, &iter, &pos, flags);
1018 if (host_err < 0) {
1017 host_err = vfs_iter_write(file, &iter, &pos, flags);
1018 if (host_err < 0) {
1019 nfsd_reset_boot_verifier(nn);
1019 nfsd_reset_write_verifier(nn);
1020 goto out_nfserr;
1021 }
1022 *cnt = host_err;
1023 nfsd_stats_io_write_add(exp, *cnt);
1024 fsnotify_modify(file);
1025 host_err = filemap_check_wb_err(file->f_mapping, since);
1026 if (host_err < 0)
1027 goto out_nfserr;
1028
1029 if (stable && use_wgather) {
1030 host_err = wait_for_concurrent_writes(file);
1031 if (host_err < 0)
1020 goto out_nfserr;
1021 }
1022 *cnt = host_err;
1023 nfsd_stats_io_write_add(exp, *cnt);
1024 fsnotify_modify(file);
1025 host_err = filemap_check_wb_err(file->f_mapping, since);
1026 if (host_err < 0)
1027 goto out_nfserr;
1028
1029 if (stable && use_wgather) {
1030 host_err = wait_for_concurrent_writes(file);
1031 if (host_err < 0)
1032 nfsd_reset_boot_verifier(nn);
1032 nfsd_reset_write_verifier(nn);
1033 }
1034
1035out_nfserr:
1036 if (host_err >= 0) {
1037 trace_nfsd_write_io_done(rqstp, fhp, offset, *cnt);
1038 nfserr = nfs_ok;
1039 } else {
1040 trace_nfsd_write_err(rqstp, fhp, offset, host_err);

--- 96 unchanged lines hidden (view full) ---

1137 nn = net_generic(nf->nf_net, nfsd_net_id);
1138 if (EX_ISSYNC(fhp->fh_export)) {
1139 errseq_t since = READ_ONCE(nf->nf_file->f_wb_err);
1140 int err2;
1141
1142 err2 = vfs_fsync_range(nf->nf_file, offset, end, 0);
1143 switch (err2) {
1144 case 0:
1033 }
1034
1035out_nfserr:
1036 if (host_err >= 0) {
1037 trace_nfsd_write_io_done(rqstp, fhp, offset, *cnt);
1038 nfserr = nfs_ok;
1039 } else {
1040 trace_nfsd_write_err(rqstp, fhp, offset, host_err);

--- 96 unchanged lines hidden (view full) ---

1137 nn = net_generic(nf->nf_net, nfsd_net_id);
1138 if (EX_ISSYNC(fhp->fh_export)) {
1139 errseq_t since = READ_ONCE(nf->nf_file->f_wb_err);
1140 int err2;
1141
1142 err2 = vfs_fsync_range(nf->nf_file, offset, end, 0);
1143 switch (err2) {
1144 case 0:
1145 nfsd_copy_boot_verifier(verf, nn);
1145 nfsd_copy_write_verifier(verf, nn);
1146 err2 = filemap_check_wb_err(nf->nf_file->f_mapping,
1147 since);
1148 break;
1149 case -EINVAL:
1150 err = nfserr_notsupp;
1151 break;
1152 default:
1146 err2 = filemap_check_wb_err(nf->nf_file->f_mapping,
1147 since);
1148 break;
1149 case -EINVAL:
1150 err = nfserr_notsupp;
1151 break;
1152 default:
1153 nfsd_reset_boot_verifier(nn);
1153 nfsd_reset_write_verifier(nn);
1154 }
1155 err = nfserrno(err2);
1156 } else
1154 }
1155 err = nfserrno(err2);
1156 } else
1157 nfsd_copy_boot_verifier(verf, nn);
1157 nfsd_copy_write_verifier(verf, nn);
1158
1159 nfsd_file_put(nf);
1160out:
1161 return err;
1162}
1163#endif /* CONFIG_NFSD_V3 */
1164
1165static __be32

--- 1241 unchanged lines hidden ---
1158
1159 nfsd_file_put(nf);
1160out:
1161 return err;
1162}
1163#endif /* CONFIG_NFSD_V3 */
1164
1165static __be32

--- 1241 unchanged lines hidden ---