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 "delegation.h"
20 #ifdef CONFIG_NFS_V4_2
24 #define NFSDBG_FACILITY NFSDBG_FILE
27 nfs4_file_open(struct inode
*inode
, struct file
*filp
)
29 struct nfs_open_context
*ctx
;
30 struct dentry
*dentry
= file_dentry(filp
);
31 struct dentry
*parent
= NULL
;
33 unsigned openflags
= filp
->f_flags
;
38 * If no cached dentry exists or if it's negative, NFSv4 handled the
39 * opens in ->lookup() or ->create().
41 * We only get this far for a cached positive dentry. We skipped
42 * revalidation, so handle it here by dropping the dentry and returning
43 * -EOPENSTALE. The VFS will retry the lookup/create/open.
46 dprintk("NFS: open file(%pd2)\n", dentry
);
48 err
= nfs_check_flags(openflags
);
52 if ((openflags
& O_ACCMODE
) == 3)
53 return nfs_open(inode
, filp
);
55 /* We can't create new files here */
56 openflags
&= ~(O_CREAT
|O_EXCL
);
58 parent
= dget_parent(dentry
);
59 dir
= d_inode(parent
);
61 ctx
= alloc_nfs_open_context(file_dentry(filp
), filp
->f_mode
, 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
);
95 put_nfs_open_context(ctx
);
107 * Flush all dirty pages, and check for write errors.
110 nfs4_file_flush(struct file
*file
, fl_owner_t id
)
112 struct inode
*inode
= file_inode(file
);
114 dprintk("NFS: flush(%pD2)\n", file
);
116 nfs_inc_stats(inode
, NFSIOS_VFSFLUSH
);
117 if ((file
->f_mode
& FMODE_WRITE
) == 0)
121 * If we're holding a write delegation, then check if we're required
122 * to flush the i/o on close. If not, then just start the i/o now.
124 if (!nfs4_delegation_flush_on_close(inode
))
125 return filemap_fdatawrite(file
->f_mapping
);
127 /* Flush writes to the server and return any errors */
128 return nfs_wb_all(inode
);
131 #ifdef CONFIG_NFS_V4_2
132 static ssize_t
__nfs4_copy_file_range(struct file
*file_in
, loff_t pos_in
,
133 struct file
*file_out
, loff_t pos_out
,
134 size_t count
, unsigned int flags
)
136 struct nfs42_copy_notify_res
*cn_resp
= NULL
;
137 struct nl4_server
*nss
= NULL
;
138 nfs4_stateid
*cnrs
= NULL
;
142 /* Only offload copy if superblock is the same */
143 if (file_in
->f_op
!= &nfs4_file_operations
)
145 if (!nfs_server_capable(file_inode(file_out
), NFS_CAP_COPY
))
147 if (file_inode(file_in
) == file_inode(file_out
))
149 /* if the copy size if smaller than 2 RPC payloads, make it
152 if (count
<= 2 * NFS_SERVER(file_inode(file_in
))->rsize
)
155 if (!nfs42_files_from_same_server(file_in
, file_out
)) {
156 /* for inter copy, if copy size if smaller than 12 RPC
157 * payloads, fallback to traditional copy. There are
158 * 14 RPCs during an NFSv4.x mount between source/dest
162 count
<= 14 * NFS_SERVER(file_inode(file_in
))->rsize
)
164 cn_resp
= kzalloc(sizeof(struct nfs42_copy_notify_res
),
166 if (unlikely(cn_resp
== NULL
))
169 ret
= nfs42_proc_copy_notify(file_in
, file_out
, cn_resp
);
174 nss
= &cn_resp
->cnr_src
;
175 cnrs
= &cn_resp
->cnr_stateid
;
177 ret
= nfs42_proc_copy(file_in
, pos_in
, file_out
, pos_out
, count
,
180 if (!nfs42_files_from_same_server(file_in
, file_out
))
187 static ssize_t
nfs4_copy_file_range(struct file
*file_in
, loff_t pos_in
,
188 struct file
*file_out
, loff_t pos_out
,
189 size_t count
, unsigned int flags
)
193 ret
= __nfs4_copy_file_range(file_in
, pos_in
, file_out
, pos_out
, count
,
195 if (ret
== -EOPNOTSUPP
|| ret
== -EXDEV
)
196 ret
= generic_copy_file_range(file_in
, pos_in
, file_out
,
197 pos_out
, count
, flags
);
201 static loff_t
nfs4_file_llseek(struct file
*filep
, loff_t offset
, int whence
)
208 ret
= nfs42_proc_llseek(filep
, offset
, whence
);
209 if (ret
!= -ENOTSUPP
)
213 return nfs_file_llseek(filep
, offset
, whence
);
217 static long nfs42_fallocate(struct file
*filep
, int mode
, loff_t offset
, loff_t len
)
219 struct inode
*inode
= file_inode(filep
);
222 if (!S_ISREG(inode
->i_mode
))
225 if ((mode
!= 0) && (mode
!= (FALLOC_FL_PUNCH_HOLE
| FALLOC_FL_KEEP_SIZE
)))
228 ret
= inode_newsize_ok(inode
, offset
+ len
);
232 if (mode
& FALLOC_FL_PUNCH_HOLE
)
233 return nfs42_proc_deallocate(filep
, offset
, len
);
234 return nfs42_proc_allocate(filep
, offset
, len
);
237 static loff_t
nfs42_remap_file_range(struct file
*src_file
, loff_t src_off
,
238 struct file
*dst_file
, loff_t dst_off
, loff_t count
,
239 unsigned int remap_flags
)
241 struct inode
*dst_inode
= file_inode(dst_file
);
242 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
243 struct inode
*src_inode
= file_inode(src_file
);
244 unsigned int bs
= server
->clone_blksize
;
245 bool same_inode
= false;
248 /* NFS does not support deduplication. */
249 if (remap_flags
& REMAP_FILE_DEDUP
)
252 if (remap_flags
& ~REMAP_FILE_ADVISORY
)
255 /* check alignment w.r.t. clone_blksize */
258 if (!IS_ALIGNED(src_off
, bs
) || !IS_ALIGNED(dst_off
, bs
))
260 if (!IS_ALIGNED(count
, bs
) && i_size_read(src_inode
) != (src_off
+ count
))
264 if (src_inode
== dst_inode
)
267 /* XXX: do we lock at all? what if server needs CB_RECALL_LAYOUT? */
269 inode_lock(src_inode
);
270 } else if (dst_inode
< src_inode
) {
271 inode_lock_nested(dst_inode
, I_MUTEX_PARENT
);
272 inode_lock_nested(src_inode
, I_MUTEX_CHILD
);
274 inode_lock_nested(src_inode
, I_MUTEX_PARENT
);
275 inode_lock_nested(dst_inode
, I_MUTEX_CHILD
);
278 /* flush all pending writes on both src and dst so that server
279 * has the latest data */
280 ret
= nfs_sync_inode(src_inode
);
283 ret
= nfs_sync_inode(dst_inode
);
287 ret
= nfs42_proc_clone(src_file
, dst_file
, src_off
, dst_off
, count
);
289 /* truncate inode page cache of the dst range so that future reads can fetch
290 * new data from server */
292 truncate_inode_pages_range(&dst_inode
->i_data
, dst_off
, dst_off
+ count
- 1);
296 inode_unlock(src_inode
);
297 } else if (dst_inode
< src_inode
) {
298 inode_unlock(src_inode
);
299 inode_unlock(dst_inode
);
301 inode_unlock(dst_inode
);
302 inode_unlock(src_inode
);
305 return ret
< 0 ? ret
: count
;
308 static int read_name_gen
= 1;
309 #define SSC_READ_NAME_BODY "ssc_read_%d"
312 nfs42_ssc_open(struct vfsmount
*ss_mnt
, struct nfs_fh
*src_fh
,
313 nfs4_stateid
*stateid
)
315 struct nfs_fattr fattr
;
316 struct file
*filep
, *res
;
317 struct nfs_server
*server
;
318 struct inode
*r_ino
= NULL
;
319 struct nfs_open_context
*ctx
;
320 struct nfs4_state_owner
*sp
;
321 char *read_name
= NULL
;
324 server
= NFS_SERVER(ss_mnt
->mnt_root
->d_inode
);
326 nfs_fattr_init(&fattr
);
328 status
= nfs4_proc_getattr(server
, src_fh
, &fattr
, NULL
, NULL
);
330 res
= ERR_PTR(status
);
334 res
= ERR_PTR(-ENOMEM
);
335 len
= strlen(SSC_READ_NAME_BODY
) + 16;
336 read_name
= kzalloc(len
, GFP_NOFS
);
337 if (read_name
== NULL
)
339 snprintf(read_name
, len
, SSC_READ_NAME_BODY
, read_name_gen
++);
341 r_ino
= nfs_fhget(ss_mnt
->mnt_root
->d_inode
->i_sb
, src_fh
, &fattr
,
344 res
= ERR_CAST(r_ino
);
348 filep
= alloc_file_pseudo(r_ino
, ss_mnt
, read_name
, FMODE_READ
,
351 res
= ERR_CAST(filep
);
354 filep
->f_mode
|= FMODE_READ
;
356 ctx
= alloc_nfs_open_context(filep
->f_path
.dentry
, filep
->f_mode
,
363 res
= ERR_PTR(-EINVAL
);
364 sp
= nfs4_get_state_owner(server
, ctx
->cred
, GFP_KERNEL
);
368 ctx
->state
= nfs4_get_open_state(r_ino
, sp
);
369 if (ctx
->state
== NULL
)
372 set_bit(NFS_SRV_SSC_COPY_STATE
, &ctx
->state
->flags
);
373 set_bit(NFS_OPEN_STATE
, &ctx
->state
->flags
);
374 memcpy(&ctx
->state
->open_stateid
.other
, &stateid
->other
,
375 NFS4_STATEID_OTHER_SIZE
);
376 update_open_stateid(ctx
->state
, stateid
, NULL
, filep
->f_mode
);
378 nfs_file_set_open_context(filep
, ctx
);
379 put_nfs_open_context(ctx
);
381 file_ra_state_init(&filep
->f_ra
, filep
->f_mapping
->host
->i_mapping
);
388 nfs4_put_state_owner(sp
);
390 put_nfs_open_context(ctx
);
395 EXPORT_SYMBOL_GPL(nfs42_ssc_open
);
396 void nfs42_ssc_close(struct file
*filep
)
398 struct nfs_open_context
*ctx
= nfs_file_open_context(filep
);
400 ctx
->state
->flags
= 0;
402 EXPORT_SYMBOL_GPL(nfs42_ssc_close
);
403 #endif /* CONFIG_NFS_V4_2 */
405 const struct file_operations nfs4_file_operations
= {
406 .read_iter
= nfs_file_read
,
407 .write_iter
= nfs_file_write
,
408 .mmap
= nfs_file_mmap
,
409 .open
= nfs4_file_open
,
410 .flush
= nfs4_file_flush
,
411 .release
= nfs_file_release
,
412 .fsync
= nfs_file_fsync
,
415 .splice_read
= generic_file_splice_read
,
416 .splice_write
= iter_file_splice_write
,
417 .check_flags
= nfs_check_flags
,
418 .setlease
= simple_nosetlease
,
419 #ifdef CONFIG_NFS_V4_2
420 .copy_file_range
= nfs4_copy_file_range
,
421 .llseek
= nfs4_file_llseek
,
422 .fallocate
= nfs42_fallocate
,
423 .remap_file_range
= nfs42_remap_file_range
,
425 .llseek
= nfs_file_llseek
,