Commit b6dde1e5 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull nfsd updates from Chuck Lever:
 "Neil Brown contributed more scalability improvements to NFSD's open
  file cache, and Jeff Layton contributed a menagerie of repairs to
  NFSD's NFSv4 callback / backchannel implementation.

  Mike Snitzer contributed a change to NFS re-export support that
  disables support for file locking on a re-exported NFSv4 mount. This
  is because NFSv4 state recovery is currently difficult if not
  impossible for re-exported NFS mounts. The change aims to prevent data
  integrity exposures after the re-export server crashes.

  Work continues on the evolving NFSD netlink administrative API.

  Many thanks to the contributors, reviewers, testers, and bug reporters
  who participated during the v6.15 development cycle"

* tag 'nfsd-6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: (45 commits)
  NFSD: Add a Kconfig setting to enable delegated timestamps
  sysctl: Fixes nsm_local_state bounds
  nfsd: use a long for the count in nfsd4_state_shrinker_count()
  nfsd: remove obsolete comment from nfs4_alloc_stid
  nfsd: remove unneeded forward declaration of nfsd4_mark_cb_fault()
  nfsd: reorganize struct nfs4_delegation for better packing
  nfsd: handle errors from rpc_call_async()
  nfsd: move cb_need_restart flag into cb_flags
  nfsd: replace CB_GETATTR_BUSY with NFSD4_CALLBACK_RUNNING
  nfsd: eliminate cl_ra_cblist and NFSD4_CLIENT_CB_RECALL_ANY
  nfsd: prevent callback tasks running concurrently
  nfsd: disallow file locking and delegations for NFSv4 reexport
  nfsd: filecache: drop the list_lru lock during lock gc scans
  nfsd: filecache: don't repeatedly add/remove files on the lru list
  nfsd: filecache: introduce NFSD_FILE_RECENT
  nfsd: filecache: use list_lru_walk_node() in nfsd_file_gc()
  nfsd: filecache: use nfsd_file_dispose_list() in nfsd_file_close_inode_sync()
  NFSD: Re-organize nfsd_file_gc_worker()
  nfsd: filecache: remove race handling.
  fs: nfs: acl: Avoid -Wflex-array-member-not-at-end warning
  ...
parents 1e7857b2 26a80762
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -26,9 +26,13 @@ Reboot recovery
---------------

The NFS protocol's normal reboot recovery mechanisms don't work for the
case when the reexport server reboots.  Clients will lose any locks
they held before the reboot, and further IO will result in errors.
Closing and reopening files should clear the errors.
case when the reexport server reboots because the source server has not
rebooted, and so it is not in grace.  Since the source server is not in
grace, it cannot offer any guarantees that the file won't have been
changed between the locks getting lost and any attempt to recover them.
The same applies to delegations and any associated locks.  Clients are
not allowed to get file locks or delegations from a reexport server, any
attempts will fail with operation not supported.

Filehandle limits
-----------------
+45 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)

name: lockd
protocol: genetlink
uapi-header: linux/lockd_netlink.h

doc: lockd configuration over generic netlink

attribute-sets:
  -
    name: server
    attributes:
      -
        name: gracetime
        type: u32
      -
        name: tcp-port
        type: u16
      -
        name: udp-port
        type: u16

operations:
  list:
    -
      name: server-set
      doc: set the lockd server parameters
      attribute-set: server
      flags: [ admin-perm ]
      do:
        request:
          attributes:
            - gracetime
            - tcp-port
            - udp-port
    -
      name: server-get
      doc: get the lockd server parameters
      attribute-set: server
      do:
        reply:
          attributes:
            - gracetime
            - tcp-port
            - udp-port
+1 −1
Original line number Diff line number Diff line
@@ -8,6 +8,6 @@ ccflags-y += -I$(src) # needed for trace events
obj-$(CONFIG_LOCKD) += lockd.o

lockd-y := clntlock.o clntproc.o clntxdr.o host.o svc.o svclock.o \
	   svcshare.o svcproc.o svcsubs.o mon.o trace.o xdr.o
	   svcshare.o svcproc.o svcsubs.o mon.o trace.o xdr.o netlink.o
lockd-$(CONFIG_LOCKD_V4) += clnt4xdr.o xdr4.o svc4proc.o
lockd-$(CONFIG_PROC_FS) += procfs.o

fs/lockd/netlink.c

0 → 100644
+44 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
/* Do not edit directly, auto-generated from: */
/*	Documentation/netlink/specs/lockd.yaml */
/* YNL-GEN kernel source */

#include <net/netlink.h>
#include <net/genetlink.h>

#include "netlink.h"

#include <uapi/linux/lockd_netlink.h>

/* LOCKD_CMD_SERVER_SET - do */
static const struct nla_policy lockd_server_set_nl_policy[LOCKD_A_SERVER_UDP_PORT + 1] = {
	[LOCKD_A_SERVER_GRACETIME] = { .type = NLA_U32, },
	[LOCKD_A_SERVER_TCP_PORT] = { .type = NLA_U16, },
	[LOCKD_A_SERVER_UDP_PORT] = { .type = NLA_U16, },
};

/* Ops table for lockd */
static const struct genl_split_ops lockd_nl_ops[] = {
	{
		.cmd		= LOCKD_CMD_SERVER_SET,
		.doit		= lockd_nl_server_set_doit,
		.policy		= lockd_server_set_nl_policy,
		.maxattr	= LOCKD_A_SERVER_UDP_PORT,
		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
	},
	{
		.cmd	= LOCKD_CMD_SERVER_GET,
		.doit	= lockd_nl_server_get_doit,
		.flags	= GENL_CMD_CAP_DO,
	},
};

struct genl_family lockd_nl_family __ro_after_init = {
	.name		= LOCKD_FAMILY_NAME,
	.version	= LOCKD_FAMILY_VERSION,
	.netnsok	= true,
	.parallel_ops	= true,
	.module		= THIS_MODULE,
	.split_ops	= lockd_nl_ops,
	.n_split_ops	= ARRAY_SIZE(lockd_nl_ops),
};

fs/lockd/netlink.h

0 → 100644
+19 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
/* Do not edit directly, auto-generated from: */
/*	Documentation/netlink/specs/lockd.yaml */
/* YNL-GEN kernel header */

#ifndef _LINUX_LOCKD_GEN_H
#define _LINUX_LOCKD_GEN_H

#include <net/netlink.h>
#include <net/genetlink.h>

#include <uapi/linux/lockd_netlink.h>

int lockd_nl_server_set_doit(struct sk_buff *skb, struct genl_info *info);
int lockd_nl_server_get_doit(struct sk_buff *skb, struct genl_info *info);

extern struct genl_family lockd_nl_family;

#endif /* _LINUX_LOCKD_GEN_H */
Loading