1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 1992 Rick Sladkey
8 #include <linux/file.h>
9 #include <linux/falloc.h>
10 #include <linux/mount.h>
11 #include <linux/nfs_fs.h>
12 #include <linux/nfs_ssc.h>
13 #include <linux/splice.h>
14 #include "delegation.h"
22 #ifdef CONFIG_NFS_V4_2
26 #define NFSDBG_FACILITY NFSDBG_FILE
29 nfs4_file_open(struct inode
*inode
, struct file
*filp
)
31 struct nfs_open_context
*ctx
;
32 struct dentry
*dentry
= file_dentry(filp
);
33 struct dentry
*parent
= NULL
;
35 unsigned openflags
= filp
->f_flags
;
40 * If no cached dentry exists or if it's negative, NFSv4 handled the
41 * opens in ->lookup() or ->create().
43 * We only get this far for a cached positive dentry. We skipped
44 * revalidation, so handle it here by dropping the dentry and returning
45 * -EOPENSTALE. The VFS will retry the lookup/create/open.
48 dprintk("NFS: open file(%pd2)\n", dentry
);
50 err
= nfs_check_flags(openflags
);
54 /* We can't create new files here */
55 openflags
&= ~(O_CREAT
|O_EXCL
);
57 parent
= dget_parent(dentry
);
58 dir
= d_inode(parent
);
60 ctx
= alloc_nfs_open_context(file_dentry(filp
),
61 flags_to_mode(openflags
), filp
);
66 attr
.ia_valid
= ATTR_OPEN
;
67 if (openflags
& O_TRUNC
) {
68 attr
.ia_valid
|= ATTR_SIZE
;
70 filemap_write_and_wait(inode
->i_mapping
);
73 inode
= NFS_PROTO(dir
)->open_context(dir
, ctx
, openflags
, &attr
, NULL
);
87 if (inode
!= d_inode(dentry
))
90 nfs_file_set_open_context(filp
, ctx
);
91 nfs_fscache_open_file(inode
, filp
);
93 filp
->f_mode
|= FMODE_CAN_ODIRECT
;
96 put_nfs_open_context(ctx
);
108 * Flush all dirty pages, and check for write errors.
111 nfs4_file_flush(struct file
*file
, fl_owner_t id
)
113 struct inode
*inode
= file_inode(file
);
116 dprintk("NFS: flush(%pD2)\n", file
);
118 nfs_inc_stats(inode
, NFSIOS_VFSFLUSH
);
119 if ((file
->f_mode
& FMODE_WRITE
) == 0)
123 * If we're holding a write delegation, then check if we're required
124 * to flush the i/o on close. If not, then just start the i/o now.
126 if (!nfs4_delegation_flush_on_close(inode
))
127 return filemap_fdatawrite(file
->f_mapping
);
129 /* Flush writes to the server and return any errors */
130 since
= filemap_sample_wb_err(file
->f_mapping
);
132 return filemap_check_wb_err(file
->f_mapping
, since
);
135 #ifdef CONFIG_NFS_V4_2
136 static ssize_t
__nfs4_copy_file_range(struct file
*file_in
, loff_t pos_in
,
137 struct file
*file_out
, loff_t pos_out
,
138 size_t count
, unsigned int flags
)
140 struct nfs42_copy_notify_res
*cn_resp
= NULL
;
141 struct nl4_server
*nss
= NULL
;
142 nfs4_stateid
*cnrs
= NULL
;
146 /* Only offload copy if superblock is the same */
147 if (file_in
->f_op
!= &nfs4_file_operations
)
149 if (!nfs_server_capable(file_inode(file_out
), NFS_CAP_COPY
) ||
150 !nfs_server_capable(file_inode(file_in
), NFS_CAP_COPY
))
152 if (file_inode(file_in
) == file_inode(file_out
))
154 /* if the copy size if smaller than 2 RPC payloads, make it
157 if (count
<= 2 * NFS_SERVER(file_inode(file_in
))->rsize
)
160 if (!nfs42_files_from_same_server(file_in
, file_out
)) {
162 * for inter copy, if copy size is too small
163 * then fallback to generic copy.
167 cn_resp
= kzalloc(sizeof(struct nfs42_copy_notify_res
),
169 if (unlikely(cn_resp
== NULL
))
172 ret
= nfs42_proc_copy_notify(file_in
, file_out
, cn_resp
);
177 nss
= &cn_resp
->cnr_src
;
178 cnrs
= &cn_resp
->cnr_stateid
;
180 ret
= nfs42_proc_copy(file_in
, pos_in
, file_out
, pos_out
, count
,
190 static ssize_t
nfs4_copy_file_range(struct file
*file_in
, loff_t pos_in
,
191 struct file
*file_out
, loff_t pos_out
,
192 size_t count
, unsigned int flags
)
196 ret
= __nfs4_copy_file_range(file_in
, pos_in
, file_out
, pos_out
, count
,
198 if (ret
== -EOPNOTSUPP
|| ret
== -EXDEV
)
199 ret
= splice_copy_file_range(file_in
, pos_in
, file_out
,
204 static loff_t
nfs4_file_llseek(struct file
*filep
, loff_t offset
, int whence
)
211 ret
= nfs42_proc_llseek(filep
, offset
, whence
);
212 if (ret
!= -EOPNOTSUPP
)
216 return nfs_file_llseek(filep
, offset
, whence
);
220 static long nfs42_fallocate(struct file
*filep
, int mode
, loff_t offset
, loff_t len
)
222 struct inode
*inode
= file_inode(filep
);
225 if (!S_ISREG(inode
->i_mode
))
228 if ((mode
!= 0) && (mode
!= (FALLOC_FL_PUNCH_HOLE
| FALLOC_FL_KEEP_SIZE
)))
231 ret
= inode_newsize_ok(inode
, offset
+ len
);
235 if (mode
& FALLOC_FL_PUNCH_HOLE
)
236 return nfs42_proc_deallocate(filep
, offset
, len
);
237 return nfs42_proc_allocate(filep
, offset
, len
);
240 static loff_t
nfs42_remap_file_range(struct file
*src_file
, loff_t src_off
,
241 struct file
*dst_file
, loff_t dst_off
, loff_t count
,
242 unsigned int remap_flags
)
244 struct inode
*dst_inode
= file_inode(dst_file
);
245 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
246 struct inode
*src_inode
= file_inode(src_file
);
247 unsigned int bs
= server
->clone_blksize
;
248 bool same_inode
= false;
251 /* NFS does not support deduplication. */
252 if (remap_flags
& REMAP_FILE_DEDUP
)
255 if (remap_flags
& ~REMAP_FILE_ADVISORY
)
258 if (IS_SWAPFILE(dst_inode
) || IS_SWAPFILE(src_inode
))
261 /* check alignment w.r.t. clone_blksize */
264 if (!IS_ALIGNED(src_off
, bs
) || !IS_ALIGNED(dst_off
, bs
))
266 if (!IS_ALIGNED(count
, bs
) && i_size_read(src_inode
) != (src_off
+ count
))
270 if (src_inode
== dst_inode
)
273 /* XXX: do we lock at all? what if server needs CB_RECALL_LAYOUT? */
275 inode_lock(src_inode
);
276 } else if (dst_inode
< src_inode
) {
277 inode_lock_nested(dst_inode
, I_MUTEX_PARENT
);
278 inode_lock_nested(src_inode
, I_MUTEX_CHILD
);
280 inode_lock_nested(src_inode
, I_MUTEX_PARENT
);
281 inode_lock_nested(dst_inode
, I_MUTEX_CHILD
);
284 /* flush all pending writes on both src and dst so that server
285 * has the latest data */
286 ret
= nfs_sync_inode(src_inode
);
289 ret
= nfs_sync_inode(dst_inode
);
293 ret
= nfs42_proc_clone(src_file
, dst_file
, src_off
, dst_off
, count
);
295 /* truncate inode page cache of the dst range so that future reads can fetch
296 * new data from server */
298 truncate_inode_pages_range(&dst_inode
->i_data
, dst_off
, dst_off
+ count
- 1);
302 inode_unlock(src_inode
);
303 } else if (dst_inode
< src_inode
) {
304 inode_unlock(src_inode
);
305 inode_unlock(dst_inode
);
307 inode_unlock(dst_inode
);
308 inode_unlock(src_inode
);
311 return ret
< 0 ? ret
: count
;
314 static int read_name_gen
= 1;
315 #define SSC_READ_NAME_BODY "ssc_read_%d"
317 static struct file
*__nfs42_ssc_open(struct vfsmount
*ss_mnt
,
318 struct nfs_fh
*src_fh
, nfs4_stateid
*stateid
)
320 struct nfs_fattr
*fattr
= nfs_alloc_fattr();
321 struct file
*filep
, *res
;
322 struct nfs_server
*server
;
323 struct inode
*r_ino
= NULL
;
324 struct nfs_open_context
*ctx
;
325 struct nfs4_state_owner
*sp
;
326 char *read_name
= NULL
;
329 server
= NFS_SB(ss_mnt
->mnt_sb
);
332 return ERR_PTR(-ENOMEM
);
334 status
= nfs4_proc_getattr(server
, src_fh
, fattr
, NULL
);
336 res
= ERR_PTR(status
);
340 if (!S_ISREG(fattr
->mode
)) {
341 res
= ERR_PTR(-EBADF
);
345 res
= ERR_PTR(-ENOMEM
);
346 len
= strlen(SSC_READ_NAME_BODY
) + 16;
347 read_name
= kzalloc(len
, GFP_KERNEL
);
348 if (read_name
== NULL
)
350 snprintf(read_name
, len
, SSC_READ_NAME_BODY
, read_name_gen
++);
352 r_ino
= nfs_fhget(ss_mnt
->mnt_sb
, src_fh
, fattr
);
354 res
= ERR_CAST(r_ino
);
358 filep
= alloc_file_pseudo(r_ino
, ss_mnt
, read_name
, O_RDONLY
,
361 res
= ERR_CAST(filep
);
366 ctx
= alloc_nfs_open_context(filep
->f_path
.dentry
,
367 flags_to_mode(filep
->f_flags
), filep
);
373 res
= ERR_PTR(-EINVAL
);
374 sp
= nfs4_get_state_owner(server
, ctx
->cred
, GFP_KERNEL
);
378 ctx
->state
= nfs4_get_open_state(r_ino
, sp
);
379 if (ctx
->state
== NULL
)
382 set_bit(NFS_SRV_SSC_COPY_STATE
, &ctx
->state
->flags
);
383 memcpy(&ctx
->state
->open_stateid
.other
, &stateid
->other
,
384 NFS4_STATEID_OTHER_SIZE
);
385 update_open_stateid(ctx
->state
, stateid
, NULL
, filep
->f_mode
);
386 set_bit(NFS_OPEN_STATE
, &ctx
->state
->flags
);
388 nfs_file_set_open_context(filep
, ctx
);
389 put_nfs_open_context(ctx
);
391 file_ra_state_init(&filep
->f_ra
, filep
->f_mapping
->host
->i_mapping
);
396 nfs_free_fattr(fattr
);
399 nfs4_put_state_owner(sp
);
401 put_nfs_open_context(ctx
);
407 static void __nfs42_ssc_close(struct file
*filep
)
409 struct nfs_open_context
*ctx
= nfs_file_open_context(filep
);
411 ctx
->state
->flags
= 0;
414 static const struct nfs4_ssc_client_ops nfs4_ssc_clnt_ops_tbl
= {
415 .sco_open
= __nfs42_ssc_open
,
416 .sco_close
= __nfs42_ssc_close
,
420 * nfs42_ssc_register_ops - Wrapper to register NFS_V4 ops in nfs_common
425 void nfs42_ssc_register_ops(void)
427 nfs42_ssc_register(&nfs4_ssc_clnt_ops_tbl
);
431 * nfs42_ssc_unregister_ops - wrapper to un-register NFS_V4 ops in nfs_common
436 void nfs42_ssc_unregister_ops(void)
438 nfs42_ssc_unregister(&nfs4_ssc_clnt_ops_tbl
);
440 #endif /* CONFIG_NFS_V4_2 */
442 static int nfs4_setlease(struct file
*file
, int arg
, struct file_lease
**lease
,
445 return nfs4_proc_setlease(file
, arg
, lease
, priv
);
448 const struct file_operations nfs4_file_operations
= {
449 .read_iter
= nfs_file_read
,
450 .write_iter
= nfs_file_write
,
451 .mmap
= nfs_file_mmap
,
452 .open
= nfs4_file_open
,
453 .flush
= nfs4_file_flush
,
454 .release
= nfs_file_release
,
455 .fsync
= nfs_file_fsync
,
458 .splice_read
= nfs_file_splice_read
,
459 .splice_write
= iter_file_splice_write
,
460 .check_flags
= nfs_check_flags
,
461 .setlease
= nfs4_setlease
,
462 #ifdef CONFIG_NFS_V4_2
463 .copy_file_range
= nfs4_copy_file_range
,
464 .llseek
= nfs4_file_llseek
,
465 .fallocate
= nfs42_fallocate
,
466 .remap_file_range
= nfs42_remap_file_range
,
468 .llseek
= nfs_file_llseek
,