mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge tag 'v6.5/vfs.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull misc vfs updates from Christian Brauner:
"Miscellaneous features, cleanups, and fixes for vfs and individual fs
Features:
- Use mode 0600 for file created by cachefilesd so it can be run by
unprivileged users. This aligns them with directories which are
already created with mode 0700 by cachefilesd
- Reorder a few members in struct file to prevent some false sharing
scenarios
- Indicate that an eventfd is used a semaphore in the eventfd's
fdinfo procfs file
- Add a missing uapi header for eventfd exposing relevant uapi
defines
- Let the VFS protect transitions of a superblock from read-only to
read-write in addition to the protection it already provides for
transitions from read-write to read-only. Protecting read-only to
read-write transitions allows filesystems such as ext4 to perform
internal writes, keeping writers away until the transition is
completed
Cleanups:
- Arnd removed the architecture specific arch_report_meminfo()
prototypes and added a generic one into procfs.h. Note, we got a
report about a warning in amdpgpu codepaths that suggested this was
bisectable to this change but we concluded it was a false positive
- Remove unused parameters from split_fs_names()
- Rename put_and_unmap_page() to unmap_and_put_page() to let the name
reflect the order of the cleanup operation that has to unmap before
the actual put
- Unexport buffer_check_dirty_writeback() as it is not used outside
of block device aops
- Stop allocating aio rings from highmem
- Protecting read-{only,write} transitions in the VFS used open-coded
barriers in various places. Replace them with proper little helpers
and document both the helpers and all barrier interactions involved
when transitioning between read-{only,write} states
- Use flexible array members in old readdir codepaths
Fixes:
- Use the correct type __poll_t for epoll and eventfd
- Replace all deprecated strlcpy() invocations, whose return value
isn't checked with an equivalent strscpy() call
- Fix some kernel-doc warnings in fs/open.c
- Reduce the stack usage in jffs2's xattr codepaths finally getting
rid of this: fs/jffs2/xattr.c:887:1: error: the frame size of 1088
bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
royally annoying compilation warning
- Use __FMODE_NONOTIFY instead of FMODE_NONOTIFY where an int and not
fmode_t is required to avoid fmode_t to integer degradation
warnings
- Create coredumps with O_WRONLY instead of O_RDWR. There's a long
explanation in that commit how O_RDWR is actually a bug which we
found out with the help of Linus and git archeology
- Fix "no previous prototype" warnings in the pipe codepaths
- Add overflow calculations for remap_verify_area() as a signed
addition overflow could be triggered in xfstests
- Fix a null pointer dereference in sysv
- Use an unsigned variable for length calculations in jfs avoiding
compilation warnings with gcc 13
- Fix a dangling pipe pointer in the watch queue codepath
- The legacy mount option parser provided as a fallback by the VFS
for filesystems not yet converted to the new mount api did prefix
the generated mount option string with a leading ',' causing issues
for some filesystems
- Fix a repeated word in a comment in fs.h
- autofs: Update the ctime when mtime is updated as mandated by
POSIX"
* tag 'v6.5/vfs.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: (27 commits)
readdir: Replace one-element arrays with flexible-array members
fs: Provide helpers for manipulating sb->s_readonly_remount
fs: Protect reconfiguration of sb read-write from racing writes
eventfd: add a uapi header for eventfd userspace APIs
autofs: set ctime as well when mtime changes on a dir
eventfd: show the EFD_SEMAPHORE flag in fdinfo
fs/aio: Stop allocating aio rings from HIGHMEM
fs: Fix comment typo
fs: unexport buffer_check_dirty_writeback
fs: avoid empty option when generating legacy mount string
watch_queue: prevent dangling pipe pointer
fs.h: Optimize file struct to prevent false sharing
highmem: Rename put_and_unmap_page() to unmap_and_put_page()
cachefiles: Allow the cache to be non-root
init: remove unused names parameter in split_fs_names()
jfs: Use unsigned variable for length calculations
fs/sysv: Null check to prevent null-ptr-deref bug
fs: use UB-safe check for signed addition overflow in remap_verify_area
procfs: consolidate arch_report_meminfo declaration
fs: pipe: reveal missing function protoypes
...
This commit is contained in:
@@ -472,9 +472,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
|
||||
|
||||
#define pte_same(A,B) (pte_val(A) == pte_val(B))
|
||||
|
||||
struct seq_file;
|
||||
extern void arch_report_meminfo(struct seq_file *m);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
|
||||
|
||||
@@ -165,9 +165,6 @@ static inline bool is_ioremap_addr(const void *x)
|
||||
|
||||
return addr >= IOREMAP_BASE && addr < IOREMAP_END;
|
||||
}
|
||||
|
||||
struct seq_file;
|
||||
void arch_report_meminfo(struct seq_file *m);
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
@@ -42,9 +42,6 @@ static inline void update_page_count(int level, long count)
|
||||
atomic_long_add(count, &direct_pages_count[level]);
|
||||
}
|
||||
|
||||
struct seq_file;
|
||||
void arch_report_meminfo(struct seq_file *m);
|
||||
|
||||
/*
|
||||
* The S390 doesn't have any external MMU info: the kernel page
|
||||
* tables contain all the necessary information.
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* Author(s): Jan Glauber <jang@linux.vnet.ibm.com>
|
||||
*/
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
extern pgd_t early_top_pgt[PTRS_PER_PGD];
|
||||
bool __init __early_make_pgtable(unsigned long address, pmdval_t pmd);
|
||||
|
||||
struct seq_file;
|
||||
void ptdump_walk_pgd_level(struct seq_file *m, struct mm_struct *mm);
|
||||
void ptdump_walk_pgd_level_debugfs(struct seq_file *m, struct mm_struct *mm,
|
||||
bool user);
|
||||
|
||||
@@ -513,9 +513,6 @@ extern void native_pagetable_init(void);
|
||||
#define native_pagetable_init paging_init
|
||||
#endif
|
||||
|
||||
struct seq_file;
|
||||
extern void arch_report_meminfo(struct seq_file *m);
|
||||
|
||||
enum pg_level {
|
||||
PG_LEVEL_NONE,
|
||||
PG_LEVEL_4K,
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
26
fs/aio.c
26
fs/aio.c
@@ -530,7 +530,7 @@ static int aio_setup_ring(struct kioctx *ctx, unsigned int nr_events)
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
struct page *page;
|
||||
page = find_or_create_page(file->f_mapping,
|
||||
i, GFP_HIGHUSER | __GFP_ZERO);
|
||||
i, GFP_USER | __GFP_ZERO);
|
||||
if (!page)
|
||||
break;
|
||||
pr_debug("pid(%d) page[%d]->count=%d\n",
|
||||
@@ -571,7 +571,7 @@ static int aio_setup_ring(struct kioctx *ctx, unsigned int nr_events)
|
||||
ctx->user_id = ctx->mmap_base;
|
||||
ctx->nr_events = nr_events; /* trusted copy */
|
||||
|
||||
ring = kmap_atomic(ctx->ring_pages[0]);
|
||||
ring = page_address(ctx->ring_pages[0]);
|
||||
ring->nr = nr_events; /* user copy */
|
||||
ring->id = ~0U;
|
||||
ring->head = ring->tail = 0;
|
||||
@@ -579,7 +579,6 @@ static int aio_setup_ring(struct kioctx *ctx, unsigned int nr_events)
|
||||
ring->compat_features = AIO_RING_COMPAT_FEATURES;
|
||||
ring->incompat_features = AIO_RING_INCOMPAT_FEATURES;
|
||||
ring->header_length = sizeof(struct aio_ring);
|
||||
kunmap_atomic(ring);
|
||||
flush_dcache_page(ctx->ring_pages[0]);
|
||||
|
||||
return 0;
|
||||
@@ -682,9 +681,8 @@ static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm)
|
||||
* we are protected from page migration
|
||||
* changes ring_pages by ->ring_lock.
|
||||
*/
|
||||
ring = kmap_atomic(ctx->ring_pages[0]);
|
||||
ring = page_address(ctx->ring_pages[0]);
|
||||
ring->id = ctx->id;
|
||||
kunmap_atomic(ring);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1025,9 +1023,8 @@ static void user_refill_reqs_available(struct kioctx *ctx)
|
||||
* against ctx->completed_events below will make sure we do the
|
||||
* safe/right thing.
|
||||
*/
|
||||
ring = kmap_atomic(ctx->ring_pages[0]);
|
||||
ring = page_address(ctx->ring_pages[0]);
|
||||
head = ring->head;
|
||||
kunmap_atomic(ring);
|
||||
|
||||
refill_reqs_available(ctx, head, ctx->tail);
|
||||
}
|
||||
@@ -1133,12 +1130,11 @@ static void aio_complete(struct aio_kiocb *iocb)
|
||||
if (++tail >= ctx->nr_events)
|
||||
tail = 0;
|
||||
|
||||
ev_page = kmap_atomic(ctx->ring_pages[pos / AIO_EVENTS_PER_PAGE]);
|
||||
ev_page = page_address(ctx->ring_pages[pos / AIO_EVENTS_PER_PAGE]);
|
||||
event = ev_page + pos % AIO_EVENTS_PER_PAGE;
|
||||
|
||||
*event = iocb->ki_res;
|
||||
|
||||
kunmap_atomic(ev_page);
|
||||
flush_dcache_page(ctx->ring_pages[pos / AIO_EVENTS_PER_PAGE]);
|
||||
|
||||
pr_debug("%p[%u]: %p: %p %Lx %Lx %Lx\n", ctx, tail, iocb,
|
||||
@@ -1152,10 +1148,9 @@ static void aio_complete(struct aio_kiocb *iocb)
|
||||
|
||||
ctx->tail = tail;
|
||||
|
||||
ring = kmap_atomic(ctx->ring_pages[0]);
|
||||
ring = page_address(ctx->ring_pages[0]);
|
||||
head = ring->head;
|
||||
ring->tail = tail;
|
||||
kunmap_atomic(ring);
|
||||
flush_dcache_page(ctx->ring_pages[0]);
|
||||
|
||||
ctx->completed_events++;
|
||||
@@ -1215,10 +1210,9 @@ static long aio_read_events_ring(struct kioctx *ctx,
|
||||
mutex_lock(&ctx->ring_lock);
|
||||
|
||||
/* Access to ->ring_pages here is protected by ctx->ring_lock. */
|
||||
ring = kmap_atomic(ctx->ring_pages[0]);
|
||||
ring = page_address(ctx->ring_pages[0]);
|
||||
head = ring->head;
|
||||
tail = ring->tail;
|
||||
kunmap_atomic(ring);
|
||||
|
||||
/*
|
||||
* Ensure that once we've read the current tail pointer, that
|
||||
@@ -1250,10 +1244,9 @@ static long aio_read_events_ring(struct kioctx *ctx,
|
||||
avail = min(avail, nr - ret);
|
||||
avail = min_t(long, avail, AIO_EVENTS_PER_PAGE - pos);
|
||||
|
||||
ev = kmap(page);
|
||||
ev = page_address(page);
|
||||
copy_ret = copy_to_user(event + ret, ev + pos,
|
||||
sizeof(*ev) * avail);
|
||||
kunmap(page);
|
||||
|
||||
if (unlikely(copy_ret)) {
|
||||
ret = -EFAULT;
|
||||
@@ -1265,9 +1258,8 @@ static long aio_read_events_ring(struct kioctx *ctx,
|
||||
head %= ctx->nr_events;
|
||||
}
|
||||
|
||||
ring = kmap_atomic(ctx->ring_pages[0]);
|
||||
ring = page_address(ctx->ring_pages[0]);
|
||||
ring->head = head;
|
||||
kunmap_atomic(ring);
|
||||
flush_dcache_page(ctx->ring_pages[0]);
|
||||
|
||||
pr_debug("%li h%u t%u\n", ret, head, tail);
|
||||
|
||||
@@ -600,7 +600,7 @@ static int autofs_dir_symlink(struct mnt_idmap *idmap,
|
||||
p_ino = autofs_dentry_ino(dentry->d_parent);
|
||||
p_ino->count++;
|
||||
|
||||
dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -633,7 +633,7 @@ static int autofs_dir_unlink(struct inode *dir, struct dentry *dentry)
|
||||
d_inode(dentry)->i_size = 0;
|
||||
clear_nlink(d_inode(dentry));
|
||||
|
||||
dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
|
||||
spin_lock(&sbi->lookup_lock);
|
||||
__autofs_add_expiring(dentry);
|
||||
@@ -749,7 +749,7 @@ static int autofs_dir_mkdir(struct mnt_idmap *idmap,
|
||||
p_ino = autofs_dentry_ino(dentry->d_parent);
|
||||
p_ino->count++;
|
||||
inc_nlink(dir);
|
||||
dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -111,7 +111,6 @@ void buffer_check_dirty_writeback(struct folio *folio,
|
||||
bh = bh->b_this_page;
|
||||
} while (bh != head);
|
||||
}
|
||||
EXPORT_SYMBOL(buffer_check_dirty_writeback);
|
||||
|
||||
/*
|
||||
* Block until a buffer comes unlocked. This doesn't stop it
|
||||
|
||||
@@ -451,7 +451,8 @@ struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)
|
||||
|
||||
ret = cachefiles_inject_write_error();
|
||||
if (ret == 0) {
|
||||
file = vfs_tmpfile_open(&nop_mnt_idmap, &parentpath, S_IFREG,
|
||||
file = vfs_tmpfile_open(&nop_mnt_idmap, &parentpath,
|
||||
S_IFREG | 0600,
|
||||
O_RDWR | O_LARGEFILE | O_DIRECT,
|
||||
cache->cache_cred);
|
||||
ret = PTR_ERR_OR_ZERO(file);
|
||||
|
||||
@@ -150,7 +150,7 @@ __register_chrdev_region(unsigned int major, unsigned int baseminor,
|
||||
cd->major = major;
|
||||
cd->baseminor = baseminor;
|
||||
cd->minorct = minorct;
|
||||
strlcpy(cd->name, name, sizeof(cd->name));
|
||||
strscpy(cd->name, name, sizeof(cd->name));
|
||||
|
||||
if (!prev) {
|
||||
cd->next = curr;
|
||||
|
||||
@@ -648,7 +648,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
|
||||
} else {
|
||||
struct mnt_idmap *idmap;
|
||||
struct inode *inode;
|
||||
int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW |
|
||||
int open_flags = O_CREAT | O_WRONLY | O_NOFOLLOW |
|
||||
O_LARGEFILE | O_EXCL;
|
||||
|
||||
if (cprm.limit < binfmt->min_coredump)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/prefetch.h>
|
||||
#include "mount.h"
|
||||
#include "internal.h"
|
||||
|
||||
struct prepend_buffer {
|
||||
char *buf;
|
||||
|
||||
12
fs/eventfd.c
12
fs/eventfd.c
@@ -33,17 +33,17 @@ struct eventfd_ctx {
|
||||
/*
|
||||
* Every time that a write(2) is performed on an eventfd, the
|
||||
* value of the __u64 being written is added to "count" and a
|
||||
* wakeup is performed on "wqh". A read(2) will return the "count"
|
||||
* value to userspace, and will reset "count" to zero. The kernel
|
||||
* side eventfd_signal() also, adds to the "count" counter and
|
||||
* issue a wakeup.
|
||||
* wakeup is performed on "wqh". If EFD_SEMAPHORE flag was not
|
||||
* specified, a read(2) will return the "count" value to userspace,
|
||||
* and will reset "count" to zero. The kernel side eventfd_signal()
|
||||
* also, adds to the "count" counter and issue a wakeup.
|
||||
*/
|
||||
__u64 count;
|
||||
unsigned int flags;
|
||||
int id;
|
||||
};
|
||||
|
||||
__u64 eventfd_signal_mask(struct eventfd_ctx *ctx, __u64 n, unsigned mask)
|
||||
__u64 eventfd_signal_mask(struct eventfd_ctx *ctx, __u64 n, __poll_t mask)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
@@ -301,6 +301,8 @@ static void eventfd_show_fdinfo(struct seq_file *m, struct file *f)
|
||||
(unsigned long long)ctx->count);
|
||||
spin_unlock_irq(&ctx->wqh.lock);
|
||||
seq_printf(m, "eventfd-id: %d\n", ctx->id);
|
||||
seq_printf(m, "eventfd-semaphore: %d\n",
|
||||
!!(ctx->flags & EFD_SEMAPHORE));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -536,7 +536,7 @@ static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi,
|
||||
#else
|
||||
|
||||
static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi,
|
||||
unsigned pollflags)
|
||||
__poll_t pollflags)
|
||||
{
|
||||
wake_up_poll(&ep->poll_wait, EPOLLIN | pollflags);
|
||||
}
|
||||
|
||||
@@ -561,7 +561,8 @@ static int legacy_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ctx->legacy_data[size++] = ',';
|
||||
if (size)
|
||||
ctx->legacy_data[size++] = ',';
|
||||
len = strlen(param->key);
|
||||
memcpy(ctx->legacy_data + size, param->key, len);
|
||||
size += len;
|
||||
|
||||
@@ -120,6 +120,47 @@ void put_super(struct super_block *sb);
|
||||
extern bool mount_capable(struct fs_context *);
|
||||
int sb_init_dio_done_wq(struct super_block *sb);
|
||||
|
||||
/*
|
||||
* Prepare superblock for changing its read-only state (i.e., either remount
|
||||
* read-write superblock read-only or vice versa). After this function returns
|
||||
* mnt_is_readonly() will return true for any mount of the superblock if its
|
||||
* caller is able to observe any changes done by the remount. This holds until
|
||||
* sb_end_ro_state_change() is called.
|
||||
*/
|
||||
static inline void sb_start_ro_state_change(struct super_block *sb)
|
||||
{
|
||||
WRITE_ONCE(sb->s_readonly_remount, 1);
|
||||
/*
|
||||
* For RO->RW transition, the barrier pairs with the barrier in
|
||||
* mnt_is_readonly() making sure if mnt_is_readonly() sees SB_RDONLY
|
||||
* cleared, it will see s_readonly_remount set.
|
||||
* For RW->RO transition, the barrier pairs with the barrier in
|
||||
* __mnt_want_write() before the mnt_is_readonly() check. The barrier
|
||||
* makes sure if __mnt_want_write() sees MNT_WRITE_HOLD already
|
||||
* cleared, it will see s_readonly_remount set.
|
||||
*/
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
/*
|
||||
* Ends section changing read-only state of the superblock. After this function
|
||||
* returns if mnt_is_readonly() returns false, the caller will be able to
|
||||
* observe all the changes remount did to the superblock.
|
||||
*/
|
||||
static inline void sb_end_ro_state_change(struct super_block *sb)
|
||||
{
|
||||
/*
|
||||
* This barrier provides release semantics that pairs with
|
||||
* the smp_rmb() acquire semantics in mnt_is_readonly().
|
||||
* This barrier pair ensure that when mnt_is_readonly() sees
|
||||
* 0 for sb->s_readonly_remount, it will also see all the
|
||||
* preceding flag changes that were made during the RO state
|
||||
* change.
|
||||
*/
|
||||
smp_wmb();
|
||||
WRITE_ONCE(sb->s_readonly_remount, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* open.c
|
||||
*/
|
||||
|
||||
@@ -211,7 +211,10 @@ static int jffs2_build_filesystem(struct jffs2_sb_info *c)
|
||||
ic->scan_dents = NULL;
|
||||
cond_resched();
|
||||
}
|
||||
jffs2_build_xattr_subsystem(c);
|
||||
ret = jffs2_build_xattr_subsystem(c);
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
c->flags &= ~JFFS2_SB_FLAG_BUILDING;
|
||||
|
||||
dbg_fsbuild("FS build complete\n");
|
||||
|
||||
@@ -772,10 +772,10 @@ void jffs2_clear_xattr_subsystem(struct jffs2_sb_info *c)
|
||||
}
|
||||
|
||||
#define XREF_TMPHASH_SIZE (128)
|
||||
void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
|
||||
int jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
|
||||
{
|
||||
struct jffs2_xattr_ref *ref, *_ref;
|
||||
struct jffs2_xattr_ref *xref_tmphash[XREF_TMPHASH_SIZE];
|
||||
struct jffs2_xattr_ref **xref_tmphash;
|
||||
struct jffs2_xattr_datum *xd, *_xd;
|
||||
struct jffs2_inode_cache *ic;
|
||||
struct jffs2_raw_node_ref *raw;
|
||||
@@ -784,9 +784,12 @@ void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
|
||||
|
||||
BUG_ON(!(c->flags & JFFS2_SB_FLAG_BUILDING));
|
||||
|
||||
xref_tmphash = kcalloc(XREF_TMPHASH_SIZE,
|
||||
sizeof(struct jffs2_xattr_ref *), GFP_KERNEL);
|
||||
if (!xref_tmphash)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Phase.1 : Merge same xref */
|
||||
for (i=0; i < XREF_TMPHASH_SIZE; i++)
|
||||
xref_tmphash[i] = NULL;
|
||||
for (ref=c->xref_temp; ref; ref=_ref) {
|
||||
struct jffs2_xattr_ref *tmp;
|
||||
|
||||
@@ -884,6 +887,8 @@ void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
|
||||
"%u of xref (%u dead, %u orphan) found.\n",
|
||||
xdatum_count, xdatum_unchecked_count, xdatum_orphan_count,
|
||||
xref_count, xref_dead_count, xref_orphan_count);
|
||||
kfree(xref_tmphash);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user