Merge 60a9483534 ("Merge tag 'warning-fixes-20211005' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs") into android-mainline
Steps on the way to 5.15-rc5 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I6cb84e4ff3efc232c0aea55ef2d71ae0123f805d
This commit is contained in:
@@ -10,8 +10,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/mips-boards/launch.h>
|
||||
|
||||
extern unsigned long __cps_access_bad_size(void)
|
||||
__compiletime_error("Bad size for CPS accessor");
|
||||
|
||||
@@ -167,30 +165,11 @@ static inline uint64_t mips_cps_cluster_config(unsigned int cluster)
|
||||
*/
|
||||
static inline unsigned int mips_cps_numcores(unsigned int cluster)
|
||||
{
|
||||
unsigned int ncores;
|
||||
|
||||
if (!mips_cm_present())
|
||||
return 0;
|
||||
|
||||
/* Add one before masking to handle 0xff indicating no cores */
|
||||
ncores = (mips_cps_cluster_config(cluster) + 1) & CM_GCR_CONFIG_PCORES;
|
||||
|
||||
if (IS_ENABLED(CONFIG_SOC_MT7621)) {
|
||||
struct cpulaunch *launch;
|
||||
|
||||
/*
|
||||
* Ralink MT7621S SoC is single core, but the GCR_CONFIG method
|
||||
* always reports 2 cores. Check the second core's LAUNCH_FREADY
|
||||
* flag to detect if the second core is missing. This method
|
||||
* only works before the core has been started.
|
||||
*/
|
||||
launch = (struct cpulaunch *)CKSEG0ADDR(CPULAUNCH);
|
||||
launch += 2; /* MT7621 has 2 VPEs per core */
|
||||
if (!(launch->flags & LAUNCH_FREADY))
|
||||
ncores = 1;
|
||||
}
|
||||
|
||||
return ncores;
|
||||
return (mips_cps_cluster_config(cluster) + 1) & CM_GCR_CONFIG_PCORES;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1646,6 +1646,8 @@ static input_system_err_t input_system_configure_channel_sensor(
|
||||
default:
|
||||
return INPUT_SYSTEM_ERR_PARAMETER_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
return INPUT_SYSTEM_ERR_NO_ERROR;
|
||||
}
|
||||
|
||||
// Test flags and set structure.
|
||||
|
||||
+4
-4
@@ -23,7 +23,7 @@ struct fscache_netfs v9fs_cache_netfs = {
|
||||
.version = 0,
|
||||
};
|
||||
|
||||
/**
|
||||
/*
|
||||
* v9fs_random_cachetag - Generate a random tag to be associated
|
||||
* with a new cache session.
|
||||
*
|
||||
@@ -233,7 +233,7 @@ static void v9fs_vfs_readpage_complete(struct page *page, void *data,
|
||||
unlock_page(page);
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* __v9fs_readpage_from_fscache - read a page from cache
|
||||
*
|
||||
* Returns 0 if the pages are in cache and a BIO is submitted,
|
||||
@@ -268,7 +268,7 @@ int __v9fs_readpage_from_fscache(struct inode *inode, struct page *page)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* __v9fs_readpages_from_fscache - read multiple pages from cache
|
||||
*
|
||||
* Returns 0 if the pages are in cache and a BIO is submitted,
|
||||
@@ -308,7 +308,7 @@ int __v9fs_readpages_from_fscache(struct inode *inode,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* __v9fs_readpage_to_fscache - write a page to the cache
|
||||
*
|
||||
*/
|
||||
|
||||
+7
-7
@@ -19,18 +19,18 @@
|
||||
#include "v9fs_vfs.h"
|
||||
#include "fid.h"
|
||||
|
||||
static inline void __add_fid(struct dentry *dentry, struct p9_fid *fid)
|
||||
{
|
||||
hlist_add_head(&fid->dlist, (struct hlist_head *)&dentry->d_fsdata);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* v9fs_fid_add - add a fid to a dentry
|
||||
* @dentry: dentry that the fid is being added to
|
||||
* @fid: fid to add
|
||||
*
|
||||
*/
|
||||
|
||||
static inline void __add_fid(struct dentry *dentry, struct p9_fid *fid)
|
||||
{
|
||||
hlist_add_head(&fid->dlist, (struct hlist_head *)&dentry->d_fsdata);
|
||||
}
|
||||
|
||||
void v9fs_fid_add(struct dentry *dentry, struct p9_fid *fid)
|
||||
{
|
||||
spin_lock(&dentry->d_lock);
|
||||
@@ -67,7 +67,7 @@ static struct p9_fid *v9fs_fid_find_inode(struct inode *inode, kuid_t uid)
|
||||
|
||||
/**
|
||||
* v9fs_open_fid_add - add an open fid to an inode
|
||||
* @dentry: inode that the fid is being added to
|
||||
* @inode: inode that the fid is being added to
|
||||
* @fid: fid to add
|
||||
*
|
||||
*/
|
||||
|
||||
+3
-5
@@ -155,6 +155,7 @@ int v9fs_show_options(struct seq_file *m, struct dentry *root)
|
||||
/**
|
||||
* v9fs_parse_options - parse mount options into session structure
|
||||
* @v9ses: existing v9fs session information
|
||||
* @opts: The mount option string
|
||||
*
|
||||
* Return 0 upon success, -ERRNO upon failure.
|
||||
*/
|
||||
@@ -542,12 +543,9 @@ extern int v9fs_error_init(void);
|
||||
static struct kobject *v9fs_kobj;
|
||||
|
||||
#ifdef CONFIG_9P_FSCACHE
|
||||
/**
|
||||
* caches_show - list caches associated with a session
|
||||
*
|
||||
* Returns the size of buffer written.
|
||||
/*
|
||||
* List caches associated with a session
|
||||
*/
|
||||
|
||||
static ssize_t caches_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
|
||||
+9
-5
@@ -30,8 +30,7 @@
|
||||
|
||||
/**
|
||||
* v9fs_fid_readpage - read an entire page in from 9P
|
||||
*
|
||||
* @fid: fid being read
|
||||
* @data: Opaque pointer to the fid being read
|
||||
* @page: structure to page
|
||||
*
|
||||
*/
|
||||
@@ -116,6 +115,8 @@ static int v9fs_vfs_readpages(struct file *filp, struct address_space *mapping,
|
||||
|
||||
/**
|
||||
* v9fs_release_page - release the private state associated with a page
|
||||
* @page: The page to be released
|
||||
* @gfp: The caller's allocation restrictions
|
||||
*
|
||||
* Returns 1 if the page can be released, false otherwise.
|
||||
*/
|
||||
@@ -129,9 +130,9 @@ static int v9fs_release_page(struct page *page, gfp_t gfp)
|
||||
|
||||
/**
|
||||
* v9fs_invalidate_page - Invalidate a page completely or partially
|
||||
*
|
||||
* @page: structure to page
|
||||
* @offset: offset in the page
|
||||
* @page: The page to be invalidated
|
||||
* @offset: offset of the invalidated region
|
||||
* @length: length of the invalidated region
|
||||
*/
|
||||
|
||||
static void v9fs_invalidate_page(struct page *page, unsigned int offset,
|
||||
@@ -199,6 +200,8 @@ static int v9fs_vfs_writepage(struct page *page, struct writeback_control *wbc)
|
||||
|
||||
/**
|
||||
* v9fs_launder_page - Writeback a dirty page
|
||||
* @page: The page to be cleaned up
|
||||
*
|
||||
* Returns 0 on success.
|
||||
*/
|
||||
|
||||
@@ -219,6 +222,7 @@ static int v9fs_launder_page(struct page *page)
|
||||
/**
|
||||
* v9fs_direct_IO - 9P address space operation for direct I/O
|
||||
* @iocb: target I/O control block
|
||||
* @iter: The data/buffer to use
|
||||
*
|
||||
* The presence of v9fs_direct_IO() in the address space ops vector
|
||||
* allowes open() O_DIRECT flags which would have failed otherwise.
|
||||
|
||||
+12
-21
@@ -359,14 +359,11 @@ out_err:
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_file_read - read from a file
|
||||
* @filp: file pointer to read
|
||||
* @udata: user data buffer to read data into
|
||||
* @count: size of buffer
|
||||
* @offset: offset at which to read data
|
||||
* v9fs_file_read_iter - read from a file
|
||||
* @iocb: The operation parameters
|
||||
* @to: The buffer to read into
|
||||
*
|
||||
*/
|
||||
|
||||
static ssize_t
|
||||
v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
{
|
||||
@@ -388,11 +385,9 @@ v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_file_write - write to a file
|
||||
* @filp: file pointer to write
|
||||
* @data: data buffer to write data from
|
||||
* @count: size of buffer
|
||||
* @offset: offset at which to write data
|
||||
* v9fs_file_write_iter - write to a file
|
||||
* @iocb: The operation parameters
|
||||
* @from: The data to write
|
||||
*
|
||||
*/
|
||||
static ssize_t
|
||||
@@ -561,11 +556,9 @@ out_unlock:
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_mmap_file_read - read from a file
|
||||
* @filp: file pointer to read
|
||||
* @data: user data buffer to read data into
|
||||
* @count: size of buffer
|
||||
* @offset: offset at which to read data
|
||||
* v9fs_mmap_file_read_iter - read from a file
|
||||
* @iocb: The operation parameters
|
||||
* @to: The buffer to read into
|
||||
*
|
||||
*/
|
||||
static ssize_t
|
||||
@@ -576,11 +569,9 @@ v9fs_mmap_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_mmap_file_write - write to a file
|
||||
* @filp: file pointer to write
|
||||
* @data: data buffer to write data from
|
||||
* @count: size of buffer
|
||||
* @offset: offset at which to write data
|
||||
* v9fs_mmap_file_write_iter - write to a file
|
||||
* @iocb: The operation parameters
|
||||
* @from: The data to write
|
||||
*
|
||||
*/
|
||||
static ssize_t
|
||||
|
||||
+16
-8
@@ -218,7 +218,7 @@ v9fs_blank_wstat(struct p9_wstat *wstat)
|
||||
|
||||
/**
|
||||
* v9fs_alloc_inode - helper function to allocate an inode
|
||||
*
|
||||
* @sb: The superblock to allocate the inode from
|
||||
*/
|
||||
struct inode *v9fs_alloc_inode(struct super_block *sb)
|
||||
{
|
||||
@@ -238,7 +238,7 @@ struct inode *v9fs_alloc_inode(struct super_block *sb)
|
||||
|
||||
/**
|
||||
* v9fs_free_inode - destroy an inode
|
||||
*
|
||||
* @inode: The inode to be freed
|
||||
*/
|
||||
|
||||
void v9fs_free_inode(struct inode *inode)
|
||||
@@ -343,7 +343,7 @@ error:
|
||||
* v9fs_get_inode - helper function to setup an inode
|
||||
* @sb: superblock
|
||||
* @mode: mode to setup inode with
|
||||
*
|
||||
* @rdev: The device numbers to set
|
||||
*/
|
||||
|
||||
struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t rdev)
|
||||
@@ -369,7 +369,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t rdev)
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_clear_inode - release an inode
|
||||
* v9fs_evict_inode - Remove an inode from the inode cache
|
||||
* @inode: inode to release
|
||||
*
|
||||
*/
|
||||
@@ -665,14 +665,15 @@ error:
|
||||
|
||||
/**
|
||||
* v9fs_vfs_create - VFS hook to create a regular file
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dir: The parent directory
|
||||
* @dentry: The name of file to be created
|
||||
* @mode: The UNIX file mode to set
|
||||
* @excl: True if the file must not yet exist
|
||||
*
|
||||
* open(.., O_CREAT) is handled in v9fs_vfs_atomic_open(). This is only called
|
||||
* for mknod(2).
|
||||
*
|
||||
* @dir: directory inode that is being created
|
||||
* @dentry: dentry that is being deleted
|
||||
* @mode: create permissions
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
@@ -696,6 +697,7 @@ v9fs_vfs_create(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
|
||||
/**
|
||||
* v9fs_vfs_mkdir - VFS mkdir hook to create a directory
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dir: inode that is being unlinked
|
||||
* @dentry: dentry that is being unlinked
|
||||
* @mode: mode for new directory
|
||||
@@ -900,10 +902,12 @@ int v9fs_vfs_rmdir(struct inode *i, struct dentry *d)
|
||||
|
||||
/**
|
||||
* v9fs_vfs_rename - VFS hook to rename an inode
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @old_dir: old dir inode
|
||||
* @old_dentry: old dentry
|
||||
* @new_dir: new dir inode
|
||||
* @new_dentry: new dentry
|
||||
* @flags: RENAME_* flags
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -1009,6 +1013,7 @@ done:
|
||||
|
||||
/**
|
||||
* v9fs_vfs_getattr - retrieve file metadata
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @path: Object to query
|
||||
* @stat: metadata structure to populate
|
||||
* @request_mask: Mask of STATX_xxx flags indicating the caller's interests
|
||||
@@ -1050,6 +1055,7 @@ v9fs_vfs_getattr(struct user_namespace *mnt_userns, const struct path *path,
|
||||
|
||||
/**
|
||||
* v9fs_vfs_setattr - set file metadata
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dentry: file whose metadata to set
|
||||
* @iattr: metadata assignment structure
|
||||
*
|
||||
@@ -1285,6 +1291,7 @@ static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry,
|
||||
|
||||
/**
|
||||
* v9fs_vfs_symlink - helper function to create symlinks
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dir: directory inode containing symlink
|
||||
* @dentry: dentry for symlink
|
||||
* @symname: symlink data
|
||||
@@ -1340,6 +1347,7 @@ v9fs_vfs_link(struct dentry *old_dentry, struct inode *dir,
|
||||
|
||||
/**
|
||||
* v9fs_vfs_mknod - create a special file
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dir: inode destination for new link
|
||||
* @dentry: dentry for file
|
||||
* @mode: mode for creation
|
||||
|
||||
@@ -37,7 +37,10 @@ v9fs_vfs_mknod_dotl(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
struct dentry *dentry, umode_t omode, dev_t rdev);
|
||||
|
||||
/**
|
||||
* v9fs_get_fsgid_for_create - Helper function to get the gid for creating a
|
||||
* v9fs_get_fsgid_for_create - Helper function to get the gid for a new object
|
||||
* @dir_inode: The directory inode
|
||||
*
|
||||
* Helper function to get the gid for creating a
|
||||
* new file system object. This checks the S_ISGID to determine the owning
|
||||
* group of the new file system object.
|
||||
*/
|
||||
@@ -211,12 +214,13 @@ int v9fs_open_to_dotl_flags(int flags)
|
||||
|
||||
/**
|
||||
* v9fs_vfs_create_dotl - VFS hook to create files for 9P2000.L protocol.
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dir: directory inode that is being created
|
||||
* @dentry: dentry that is being deleted
|
||||
* @omode: create permissions
|
||||
* @excl: True if the file must not yet exist
|
||||
*
|
||||
*/
|
||||
|
||||
static int
|
||||
v9fs_vfs_create_dotl(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
struct dentry *dentry, umode_t omode, bool excl)
|
||||
@@ -361,6 +365,7 @@ err_clunk_old_fid:
|
||||
|
||||
/**
|
||||
* v9fs_vfs_mkdir_dotl - VFS mkdir hook to create a directory
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dir: inode that is being unlinked
|
||||
* @dentry: dentry that is being unlinked
|
||||
* @omode: mode for new directory
|
||||
@@ -537,6 +542,7 @@ static int v9fs_mapped_iattr_valid(int iattr_valid)
|
||||
|
||||
/**
|
||||
* v9fs_vfs_setattr_dotl - set file metadata
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dentry: file whose metadata to set
|
||||
* @iattr: metadata assignment structure
|
||||
*
|
||||
@@ -816,6 +822,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
|
||||
|
||||
/**
|
||||
* v9fs_vfs_mknod_dotl - create a special file
|
||||
* @mnt_userns: The user namespace of the mount
|
||||
* @dir: inode destination for new link
|
||||
* @dentry: dentry for file
|
||||
* @omode: mode for creation
|
||||
|
||||
+2
-2
@@ -86,8 +86,8 @@ static int afs_do_silly_rename(struct afs_vnode *dvnode, struct afs_vnode *vnode
|
||||
return afs_do_sync_operation(op);
|
||||
}
|
||||
|
||||
/**
|
||||
* afs_sillyrename - Perform a silly-rename of a dentry
|
||||
/*
|
||||
* Perform silly-rename of a dentry.
|
||||
*
|
||||
* AFS is stateless and the server doesn't know when the client is holding a
|
||||
* file open. To prevent application problems when a file is unlinked while
|
||||
|
||||
+1
-1
@@ -77,7 +77,6 @@ static WORK_STATE(INIT_OBJECT, "INIT", fscache_initialise_object);
|
||||
static WORK_STATE(PARENT_READY, "PRDY", fscache_parent_ready);
|
||||
static WORK_STATE(ABORT_INIT, "ABRT", fscache_abort_initialisation);
|
||||
static WORK_STATE(LOOK_UP_OBJECT, "LOOK", fscache_look_up_object);
|
||||
static WORK_STATE(CREATE_OBJECT, "CRTO", fscache_look_up_object);
|
||||
static WORK_STATE(OBJECT_AVAILABLE, "AVBL", fscache_object_available);
|
||||
static WORK_STATE(JUMPSTART_DEPS, "JUMP", fscache_jumpstart_dependents);
|
||||
|
||||
@@ -907,6 +906,7 @@ static void fscache_dequeue_object(struct fscache_object *object)
|
||||
* @object: The object to ask about
|
||||
* @data: The auxiliary data for the object
|
||||
* @datalen: The size of the auxiliary data
|
||||
* @object_size: The size of the object according to the server.
|
||||
*
|
||||
* This function consults the netfs about the coherency state of an object.
|
||||
* The caller must be holding a ref on cookie->n_active (held by
|
||||
|
||||
@@ -22,7 +22,10 @@ static void fscache_operation_dummy_cancel(struct fscache_operation *op)
|
||||
|
||||
/**
|
||||
* fscache_operation_init - Do basic initialisation of an operation
|
||||
* @cookie: The cookie to operate on
|
||||
* @op: The operation to initialise
|
||||
* @processor: The function to perform the operation
|
||||
* @cancel: A function to handle operation cancellation
|
||||
* @release: The release function to assign
|
||||
*
|
||||
* Do basic initialisation of an operation. The caller must still set flags,
|
||||
|
||||
@@ -42,7 +42,6 @@ EXPORT_SYMBOL_GPL(locks_start_grace);
|
||||
|
||||
/**
|
||||
* locks_end_grace
|
||||
* @net: net namespace that this lock manager belongs to
|
||||
* @lm: who this grace period is for
|
||||
*
|
||||
* Call this function to state that the given lock manager is ready to
|
||||
|
||||
+7
-3
@@ -1219,9 +1219,13 @@ static int ovl_rename(struct user_namespace *mnt_userns, struct inode *olddir,
|
||||
goto out_dput;
|
||||
}
|
||||
} else {
|
||||
if (!d_is_negative(newdentry) &&
|
||||
(!new_opaque || !ovl_is_whiteout(newdentry)))
|
||||
goto out_dput;
|
||||
if (!d_is_negative(newdentry)) {
|
||||
if (!new_opaque || !ovl_is_whiteout(newdentry))
|
||||
goto out_dput;
|
||||
} else {
|
||||
if (flags & RENAME_EXCHANGE)
|
||||
goto out_dput;
|
||||
}
|
||||
}
|
||||
|
||||
if (olddentry == trap)
|
||||
|
||||
+14
-1
@@ -282,6 +282,12 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (iocb->ki_flags & IOCB_DIRECT &&
|
||||
(!real.file->f_mapping->a_ops ||
|
||||
!real.file->f_mapping->a_ops->direct_IO))
|
||||
goto out_fdput;
|
||||
|
||||
old_cred = ovl_override_creds(file_inode(file)->i_sb);
|
||||
if (is_sync_kiocb(iocb)) {
|
||||
ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
|
||||
@@ -307,7 +313,7 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
out:
|
||||
revert_creds(old_cred);
|
||||
ovl_file_accessed(file);
|
||||
|
||||
out_fdput:
|
||||
fdput(real);
|
||||
|
||||
return ret;
|
||||
@@ -336,6 +342,12 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (iocb->ki_flags & IOCB_DIRECT &&
|
||||
(!real.file->f_mapping->a_ops ||
|
||||
!real.file->f_mapping->a_ops->direct_IO))
|
||||
goto out_fdput;
|
||||
|
||||
if (!ovl_should_sync(OVL_FS(inode->i_sb)))
|
||||
ifl &= ~(IOCB_DSYNC | IOCB_SYNC);
|
||||
|
||||
@@ -371,6 +383,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
}
|
||||
out:
|
||||
revert_creds(old_cred);
|
||||
out_fdput:
|
||||
fdput(real);
|
||||
|
||||
out_unlock:
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#define _GNU_SOURCE
|
||||
#define __EXPORTED_HEADERS__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <fcntl.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
Reference in New Issue
Block a user