mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
![Linus Torvalds](/assets/img/avatar_default.png)
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmP2kaAACgkQiiy9cAdy T1Eergv9FHVs7hS0anJF0xgRghR4+g0m5UUo08iJazgJdDgcS5JY+ZasIpYpEsG3 QmsIT33XVYZypXoOzjMSsPlwo6esTCJQScVLz85e4ebedCbCBDks+wVQcbfTzD5/ KrwmUoTBLU0L/ppFhqRk9k53nrSf1SXCWPthjdfWa3mTHdIVM4kQJruTWwUDiJXp mdYwTx6FnTNer3QWetNzYOwdUgLu3rk0zLcBwQNCo6g5LOpA44iFfEAO4zeiOuZT LMDPbDj0nWQyWPLLdcbtsn2laYyEBDBLZevLirSaqPQ/KCtGcw0mBt6dCAzg8/CM ONqHHxdEpvPON8Sxujcn4CxpXhl0nCLwwtKtWU4rt7IevI9U+PynNl57TtJJ16/s b3XD2QVbFjlcdAMTmArvqnogdzoC3mZu1R1IRs+jukhLAOqZiLN6o/E2HAllt47i krzXeXIzQr10w9fnJ7LtIc/7IUFgtUfrOkg4TKyNcnRVHQaSSxv+JLRgqMPOr/M0 I7zt0G0j =4hIT -----END PGP SIGNATURE----- Merge tag '6.3-rc-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs client updates from Steve French: "The largest subset of this is from David Howells et al: making the cifs/smb3 driver pass iov_iters down to the lowest layers, directly to the network transport rather than passing lists of pages around, helping multiple areas: - Pin user pages, thereby fixing the race between concurrent DIO read and fork, where the pages containing the DIO read buffer may end up belonging to the child process and not the parent - with the result that the parent might not see the retrieved data. - cifs shouldn't take refs on pages extracted from non-user-backed iterators (eg. KVEC). With these changes, cifs will apply the appropriate cleanup. - Making it easier to transition to using folios in cifs rather than pages by dealing with them through BVEC and XARRAY iterators. - Allowing cifs to use the new splice function The remainder are: - fixes for stable, including various fixes for uninitialized memory, wrong length field causing mount issue to very old servers, important directory lease fixes and reconnect fixes - cleanups (unused code removal, change one element array usage, and a change form strtobool to kstrtobool, and Kconfig cleanups) - SMBDIRECT (RDMA) fixes including iov_iter integration and UAF fixes - reconnect fixes - multichannel fixes, including improving channel allocation (to least used channel) - remove the last use of lock_page_killable by moving to folio_lock_killable" * tag '6.3-rc-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6: (46 commits) update internal module version number for cifs.ko cifs: update ip_addr for ses only for primary chan setup cifs: use tcon allocation functions even for dummy tcon cifs: use the least loaded channel for sending requests cifs: DIO to/from KVEC-type iterators should now work cifs: Remove unused code cifs: Build the RDMA SGE list directly from an iterator cifs: Change the I/O paths to use an iterator rather than a page list cifs: Add a function to read into an iter from a socket cifs: Add some helper functions cifs: Add a function to Hash the contents of an iterator cifs: Add a function to build an RDMA SGE list from an iterator netfs: Add a function to extract an iterator into a scatterlist netfs: Add a function to extract a UBUF or IOVEC into a BVEC iterator cifs: Implement splice_read to pass down ITER_BVEC not ITER_PIPE splice: Export filemap/direct_splice_read() iov_iter: Add a function to extract a page list from an iterator iov_iter: Define flags to qualify page extraction. splice: Add a func to do a splice from an O_DIRECT file without ITER_PIPE splice: Add a func to do a splice from a buffered file without ITER_PIPE ...
164 lines
6.7 KiB
C
164 lines
6.7 KiB
C
/* SPDX-License-Identifier: LGPL-2.1 */
|
|
/*
|
|
*
|
|
* Copyright (c) International Business Machines Corp., 2002, 2007
|
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
|
*
|
|
*/
|
|
|
|
#ifndef _CIFSFS_H
|
|
#define _CIFSFS_H
|
|
|
|
#include <linux/hash.h>
|
|
|
|
#define ROOT_I 2
|
|
|
|
/*
|
|
* ino_t is 32-bits on 32-bit arch. We have to squash the 64-bit value down
|
|
* so that it will fit. We use hash_64 to convert the value to 31 bits, and
|
|
* then add 1, to ensure that we don't end up with a 0 as the value.
|
|
*/
|
|
static inline ino_t
|
|
cifs_uniqueid_to_ino_t(u64 fileid)
|
|
{
|
|
if ((sizeof(ino_t)) < (sizeof(u64)))
|
|
return (ino_t)hash_64(fileid, (sizeof(ino_t) * 8) - 1) + 1;
|
|
|
|
return (ino_t)fileid;
|
|
|
|
}
|
|
|
|
static inline void cifs_set_time(struct dentry *dentry, unsigned long time)
|
|
{
|
|
dentry->d_fsdata = (void *) time;
|
|
}
|
|
|
|
static inline unsigned long cifs_get_time(struct dentry *dentry)
|
|
{
|
|
return (unsigned long) dentry->d_fsdata;
|
|
}
|
|
|
|
extern struct file_system_type cifs_fs_type, smb3_fs_type;
|
|
extern const struct address_space_operations cifs_addr_ops;
|
|
extern const struct address_space_operations cifs_addr_ops_smallbuf;
|
|
|
|
/* Functions related to super block operations */
|
|
extern void cifs_sb_active(struct super_block *sb);
|
|
extern void cifs_sb_deactive(struct super_block *sb);
|
|
|
|
/* Functions related to inodes */
|
|
extern const struct inode_operations cifs_dir_inode_ops;
|
|
extern struct inode *cifs_root_iget(struct super_block *);
|
|
extern int cifs_create(struct mnt_idmap *, struct inode *,
|
|
struct dentry *, umode_t, bool excl);
|
|
extern int cifs_atomic_open(struct inode *, struct dentry *,
|
|
struct file *, unsigned, umode_t);
|
|
extern struct dentry *cifs_lookup(struct inode *, struct dentry *,
|
|
unsigned int);
|
|
extern int cifs_unlink(struct inode *dir, struct dentry *dentry);
|
|
extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *);
|
|
extern int cifs_mknod(struct mnt_idmap *, struct inode *, struct dentry *,
|
|
umode_t, dev_t);
|
|
extern int cifs_mkdir(struct mnt_idmap *, struct inode *, struct dentry *,
|
|
umode_t);
|
|
extern int cifs_rmdir(struct inode *, struct dentry *);
|
|
extern int cifs_rename2(struct mnt_idmap *, struct inode *,
|
|
struct dentry *, struct inode *, struct dentry *,
|
|
unsigned int);
|
|
extern int cifs_revalidate_file_attr(struct file *filp);
|
|
extern int cifs_revalidate_dentry_attr(struct dentry *);
|
|
extern int cifs_revalidate_file(struct file *filp);
|
|
extern int cifs_revalidate_dentry(struct dentry *);
|
|
extern int cifs_invalidate_mapping(struct inode *inode);
|
|
extern int cifs_revalidate_mapping(struct inode *inode);
|
|
extern int cifs_zap_mapping(struct inode *inode);
|
|
extern int cifs_getattr(struct mnt_idmap *, const struct path *,
|
|
struct kstat *, u32, unsigned int);
|
|
extern int cifs_setattr(struct mnt_idmap *, struct dentry *,
|
|
struct iattr *);
|
|
extern int cifs_fiemap(struct inode *, struct fiemap_extent_info *, u64 start,
|
|
u64 len);
|
|
|
|
extern const struct inode_operations cifs_file_inode_ops;
|
|
extern const struct inode_operations cifs_symlink_inode_ops;
|
|
extern const struct inode_operations cifs_dfs_referral_inode_operations;
|
|
|
|
|
|
/* Functions related to files and directories */
|
|
extern const struct file_operations cifs_file_ops;
|
|
extern const struct file_operations cifs_file_direct_ops; /* if directio mnt */
|
|
extern const struct file_operations cifs_file_strict_ops; /* if strictio mnt */
|
|
extern const struct file_operations cifs_file_nobrl_ops; /* no brlocks */
|
|
extern const struct file_operations cifs_file_direct_nobrl_ops;
|
|
extern const struct file_operations cifs_file_strict_nobrl_ops;
|
|
extern int cifs_open(struct inode *inode, struct file *file);
|
|
extern int cifs_close(struct inode *inode, struct file *file);
|
|
extern int cifs_closedir(struct inode *inode, struct file *file);
|
|
extern ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to);
|
|
extern ssize_t cifs_direct_readv(struct kiocb *iocb, struct iov_iter *to);
|
|
extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to);
|
|
extern ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from);
|
|
extern ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from);
|
|
extern ssize_t cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from);
|
|
extern ssize_t cifs_splice_read(struct file *in, loff_t *ppos,
|
|
struct pipe_inode_info *pipe, size_t len,
|
|
unsigned int flags);
|
|
extern int cifs_flock(struct file *pfile, int cmd, struct file_lock *plock);
|
|
extern int cifs_lock(struct file *, int, struct file_lock *);
|
|
extern int cifs_fsync(struct file *, loff_t, loff_t, int);
|
|
extern int cifs_strict_fsync(struct file *, loff_t, loff_t, int);
|
|
extern int cifs_flush(struct file *, fl_owner_t id);
|
|
extern int cifs_file_mmap(struct file *file, struct vm_area_struct *vma);
|
|
extern int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma);
|
|
extern const struct file_operations cifs_dir_ops;
|
|
extern int cifs_dir_open(struct inode *inode, struct file *file);
|
|
extern int cifs_readdir(struct file *file, struct dir_context *ctx);
|
|
extern void cifs_pages_written_back(struct inode *inode, loff_t start, unsigned int len);
|
|
extern void cifs_pages_write_failed(struct inode *inode, loff_t start, unsigned int len);
|
|
extern void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned int len);
|
|
|
|
/* Functions related to dir entries */
|
|
extern const struct dentry_operations cifs_dentry_ops;
|
|
extern const struct dentry_operations cifs_ci_dentry_ops;
|
|
|
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
|
extern struct vfsmount *cifs_dfs_d_automount(struct path *path);
|
|
#else
|
|
#define cifs_dfs_d_automount NULL
|
|
#endif
|
|
|
|
/* Functions related to symlinks */
|
|
extern const char *cifs_get_link(struct dentry *, struct inode *,
|
|
struct delayed_call *);
|
|
extern int cifs_symlink(struct mnt_idmap *idmap, struct inode *inode,
|
|
struct dentry *direntry, const char *symname);
|
|
|
|
#ifdef CONFIG_CIFS_XATTR
|
|
extern const struct xattr_handler *cifs_xattr_handlers[];
|
|
extern ssize_t cifs_listxattr(struct dentry *, char *, size_t);
|
|
#else
|
|
# define cifs_xattr_handlers NULL
|
|
# define cifs_listxattr NULL
|
|
#endif
|
|
|
|
extern ssize_t cifs_file_copychunk_range(unsigned int xid,
|
|
struct file *src_file, loff_t off,
|
|
struct file *dst_file, loff_t destoff,
|
|
size_t len, unsigned int flags);
|
|
|
|
extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
|
|
extern void cifs_setsize(struct inode *inode, loff_t offset);
|
|
extern int cifs_truncate_page(struct address_space *mapping, loff_t from);
|
|
|
|
struct smb3_fs_context;
|
|
extern struct dentry *cifs_smb3_do_mount(struct file_system_type *fs_type,
|
|
int flags, struct smb3_fs_context *ctx);
|
|
|
|
#ifdef CONFIG_CIFS_NFSD_EXPORT
|
|
extern const struct export_operations cifs_export_ops;
|
|
#endif /* CONFIG_CIFS_NFSD_EXPORT */
|
|
|
|
/* when changing internal version - update following two lines at same time */
|
|
#define SMB3_PRODUCT_BUILD 41
|
|
#define CIFS_VERSION "2.42"
|
|
#endif /* _CIFSFS_H */
|