mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
Merge branch 'fixes-from-sasha'
Misc fixes for this merge window from Sasha Levin that were posted for issues found in linux-next but not picked up by maintainers. In an almost certainly futile attempt to clean up the disaster area that is my inbox, I'm merging them directly rather than leaving them pending and wait for them to come in through the proper channels. * fixes-from-sasha: selftests/fuse: add the missing symlink caching test fuse: fix link error with CONFIG_FUSE_PASSTHROUGH=n xprtrdma: fix up the nfs/nfs-anna merge of the Write chunk head trim
This commit is contained in:
commit
ac1bf565f1
|
|
@ -2334,9 +2334,6 @@ static struct fuse_conn *fuse_get_conn_for_passthrough(struct file *file)
|
|||
if (!smp_load_acquire(&fud->chan->initialized))
|
||||
return ERR_PTR(-ENOTCONN);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_FUSE_PASSTHROUGH))
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
return fud->chan->conn;
|
||||
}
|
||||
|
||||
|
|
@ -2349,6 +2346,9 @@ static long fuse_dev_ioctl_backing_open(struct file *file,
|
|||
if (IS_ERR(fc))
|
||||
return PTR_ERR(fc);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_FUSE_PASSTHROUGH))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (copy_from_user(&map, argp, sizeof(map)))
|
||||
return -EFAULT;
|
||||
|
||||
|
|
@ -2364,6 +2364,9 @@ static long fuse_dev_ioctl_backing_create(struct file *file,
|
|||
if (IS_ERR(fc))
|
||||
return PTR_ERR(fc);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_FUSE_PASSTHROUGH))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (copy_from_user(&map, argp, sizeof(map)))
|
||||
return -EFAULT;
|
||||
|
||||
|
|
@ -2378,6 +2381,9 @@ static long fuse_dev_ioctl_backing_close(struct file *file, __u32 __user *argp)
|
|||
if (IS_ERR(fc))
|
||||
return PTR_ERR(fc);
|
||||
|
||||
if (!IS_ENABLED(CONFIG_FUSE_PASSTHROUGH))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (get_user(backing_id, argp))
|
||||
return -EFAULT;
|
||||
|
||||
|
|
|
|||
|
|
@ -1010,7 +1010,7 @@ rpcrdma_inline_fixup(struct rpc_rqst *rqst, char *srcp, int copy_len,
|
|||
char *destp;
|
||||
struct page **ppages;
|
||||
int page_base;
|
||||
int pad = writelist & 3;
|
||||
int pad = xdr_pad_size(writelist);
|
||||
unsigned int delta;
|
||||
|
||||
/* The head iovec is redirected to the RPC reply message
|
||||
|
|
@ -1267,14 +1267,9 @@ rpcrdma_decode_msg(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep,
|
|||
rpclen &= ~3;
|
||||
if (unlikely(!rpclen))
|
||||
return -EIO;
|
||||
if (writelist && rpclen < rqst->rq_rcv_buf.head[0].iov_len) {
|
||||
rqst->rq_rcv_buf.head[0].iov_len = rpclen;
|
||||
rqst->rq_private_buf.head[0].iov_len = rpclen;
|
||||
}
|
||||
|
||||
r_xprt->rx_stats.fixup_copy_count +=
|
||||
rpcrdma_inline_fixup(rqst, base, rpclen,
|
||||
xdr_pad_size(writelist));
|
||||
rpcrdma_inline_fixup(rqst, base, rpclen, writelist);
|
||||
|
||||
r_xprt->rx_stats.total_rdma_reply += writelist;
|
||||
return rpclen + xdr_align_size(writelist);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,162 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Simple filesystem to test FUSE symlink cache
|
||||
*
|
||||
* This is a simple FUSE filesystem that contains two objects: a file named
|
||||
* 'file' and a symlink to that file named 'link'. If symlink caching is
|
||||
* disabled (i.e. FUSE_CAP_CACHE_SYMLINKS is reset during FUSE_INIT), whenever
|
||||
* the ->readlink() is executed to resolve 'link' a counter will be incremented.
|
||||
*
|
||||
* If symlink caching is enabled (i.e. FUSE_CAP_CACHE_SYMLINKS is set during
|
||||
* FUSE_INIT), resolving a symlink will only call into user-space the first
|
||||
* time.
|
||||
*/
|
||||
|
||||
#define FUSE_USE_VERSION 31
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fuse_lowlevel.h>
|
||||
|
||||
#include "kselftest_harness.h"
|
||||
|
||||
#include "fuse_common.h"
|
||||
|
||||
#define FILENAME "file"
|
||||
#define FILE_INO 42
|
||||
|
||||
#define LINKNAME "link"
|
||||
#define LINK_INO 43
|
||||
|
||||
#define TIMEOUT 86400.0f
|
||||
|
||||
struct test_state {
|
||||
pthread_mutex_t lock;
|
||||
int readlink_counter;
|
||||
bool cache;
|
||||
} test_state = {
|
||||
.lock = PTHREAD_MUTEX_INITIALIZER,
|
||||
};
|
||||
|
||||
static void fs_init(void *userdata, struct fuse_conn_info *conn)
|
||||
{
|
||||
pthread_mutex_lock(&test_state.lock);
|
||||
if (test_state.cache)
|
||||
fuse_set_feature_flag(conn, FUSE_CAP_CACHE_SYMLINKS);
|
||||
else
|
||||
fuse_unset_feature_flag(conn, FUSE_CAP_CACHE_SYMLINKS);
|
||||
pthread_mutex_unlock(&test_state.lock);
|
||||
}
|
||||
|
||||
static void fs_lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
|
||||
{
|
||||
struct fuse_entry_param e = {};
|
||||
|
||||
if (parent != FUSE_ROOT_ID ||
|
||||
(strcmp(name, FILENAME) != 0 && strcmp(name, LINKNAME) != 0)) {
|
||||
fuse_reply_err(req, ENOENT);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(name, FILENAME)) {
|
||||
e.ino = FILE_INO;
|
||||
e.attr.st_mode = S_IFREG | 0444;
|
||||
e.attr.st_nlink = 2;
|
||||
} else if (!strcmp(name, LINKNAME)) {
|
||||
e.ino = LINK_INO;
|
||||
e.attr.st_mode = S_IFLNK | 0444;
|
||||
e.attr.st_nlink = 1;
|
||||
e.attr.st_size = strlen(FILENAME);
|
||||
}
|
||||
e.attr_timeout = TIMEOUT;
|
||||
e.entry_timeout = TIMEOUT;
|
||||
|
||||
fuse_reply_entry(req, &e);
|
||||
}
|
||||
|
||||
static void fs_readlink(fuse_req_t req, fuse_ino_t ino)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
size_t sz = strlen(FILENAME);
|
||||
|
||||
if (ino != LINK_INO) {
|
||||
fuse_reply_err(req, ENOENT);
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(buf, FILENAME, sz);
|
||||
buf[sz] = '\0';
|
||||
pthread_mutex_lock(&test_state.lock);
|
||||
test_state.readlink_counter++;
|
||||
pthread_mutex_unlock(&test_state.lock);
|
||||
|
||||
fuse_reply_readlink(req, buf);
|
||||
}
|
||||
|
||||
static const struct fuse_lowlevel_ops fs_ops = {
|
||||
.init = fs_init,
|
||||
.lookup = fs_lookup,
|
||||
.readlink = fs_readlink,
|
||||
};
|
||||
|
||||
FIXTURE(symlink_cache)
|
||||
{
|
||||
struct fuse_common_ctx ctx;
|
||||
};
|
||||
FIXTURE_VARIANT(symlink_cache)
|
||||
{
|
||||
const bool cache;
|
||||
};
|
||||
FIXTURE_VARIANT_ADD(symlink_cache, symlinks_nocache)
|
||||
{
|
||||
/* Variant with symlink cache disabled */
|
||||
.cache = false,
|
||||
};
|
||||
FIXTURE_VARIANT_ADD(symlink_cache, symlinks_cache)
|
||||
{
|
||||
/* Variant with symlink cache enabled */
|
||||
.cache = true,
|
||||
};
|
||||
|
||||
FIXTURE_SETUP(symlink_cache)
|
||||
{
|
||||
char err[MAX_ERR_MSG];
|
||||
|
||||
pthread_mutex_lock(&test_state.lock);
|
||||
test_state.readlink_counter = 0;
|
||||
test_state.cache = variant->cache;
|
||||
pthread_mutex_unlock(&test_state.lock);
|
||||
|
||||
if (fs_setup(&fs_ops, &self->ctx, err))
|
||||
SKIP(return, err);
|
||||
}
|
||||
|
||||
FIXTURE_TEARDOWN(symlink_cache)
|
||||
{
|
||||
fs_teardown(&self->ctx);
|
||||
}
|
||||
|
||||
TEST_F(symlink_cache, test_symlink_cache)
|
||||
{
|
||||
char pathname[PATH_MAX];
|
||||
char buf[PATH_MAX];
|
||||
ssize_t sz;
|
||||
int counter;
|
||||
int i;
|
||||
|
||||
sprintf(pathname, "%s/%s", self->ctx.mountpoint, LINKNAME);
|
||||
for (i = 0; i < 100; i++) {
|
||||
sz = readlink(pathname, buf, PATH_MAX);
|
||||
ASSERT_NE(sz, -1);
|
||||
}
|
||||
pthread_mutex_lock(&test_state.lock);
|
||||
counter = test_state.readlink_counter;
|
||||
pthread_mutex_unlock(&test_state.lock);
|
||||
|
||||
if (variant->cache) {
|
||||
ASSERT_EQ(counter, 1);
|
||||
} else {
|
||||
ASSERT_EQ(counter, 100);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_HARNESS_MAIN
|
||||
Loading…
Reference in New Issue
Block a user