mbox series

[RFC,0/5] nfsd/sunrpc: cleanup resource with sync mode

Message ID 20241216142156.4133267-1-yangerkun@huaweicloud.com (mailing list archive)
Headers show
Series nfsd/sunrpc: cleanup resource with sync mode | expand

Message

yangerkun Dec. 16, 2024, 2:21 p.m. UTC
From: Yang Erkun <yangerkun@huawei.com>

After f8c989a0c89a ("nfsd: release svc_expkey/svc_export with
rcu_work"), svc_export_put/expkey_put will call path_put with async
mode. This can lead some unexpected failure:

mkdir /mnt/sda
mkfs.xfs -f /dev/sda
echo "/ *(rw,no_root_squash,fsid=0)" > /etc/exports
echo "/mnt *(rw,no_root_squash,fsid=1)" >> /etc/exports
exportfs -ra
service nfs-server start
mount -t nfs -o vers=4.0 127.0.0.1:/mnt /mnt1
mount /dev/sda /mnt/sda
touch /mnt1/sda/file
exportfs -r
umount /mnt/sda # failed unexcepted

The touch above will finally call nfsd_cross_mnt, add refcount to mount,
and then add cache_head. Before this commit, exportfs -r will call
cache_flush to cleanup all cache_head, and path_put in
svc_export_put/expkey_put will be finished with sync mode. So, the
latter umount will always success. However, after this commit, path_put
will be called with async mode, the latter umount may failed, and if we
add some delay, umount will success too. Personally I think this bug and
should be fixed. We first revert before bugfix patch, and then fix the
original bug with a different way.

Yang Erkun (5):
  nfsd: Revert "nfsd: release svc_expkey/svc_export with rcu_work"
  SUNRPC: move cache_put out from cache_check
  nfsd: no need get cache ref when protected by rcu
  SUNRPC: no need get cache ref when protected by rcu
  nfsd: fix UAF when access ex_uuid or ex_stats

 fs/nfs/dns_resolve.c              |  4 +++-
 fs/nfsd/export.c                  | 34 ++++++++++---------------------
 fs/nfsd/export.h                  |  4 ++--
 fs/nfsd/nfs4idmap.c               |  2 ++
 net/sunrpc/auth_gss/svcauth_gss.c |  9 ++++++--
 net/sunrpc/cache.c                | 11 ++--------
 net/sunrpc/svcauth_unix.c         | 12 ++++++++++-
 7 files changed, 38 insertions(+), 38 deletions(-)

Comments

Chuck Lever Dec. 17, 2024, 2:55 p.m. UTC | #1
From: Chuck Lever <chuck.lever@oracle.com>

On Mon, 16 Dec 2024 22:21:51 +0800, Yang Erkun wrote:
> After f8c989a0c89a ("nfsd: release svc_expkey/svc_export with
> rcu_work"), svc_export_put/expkey_put will call path_put with async
> mode. This can lead some unexpected failure:
> 
> mkdir /mnt/sda
> mkfs.xfs -f /dev/sda
> echo "/ *(rw,no_root_squash,fsid=0)" > /etc/exports
> echo "/mnt *(rw,no_root_squash,fsid=1)" >> /etc/exports
> exportfs -ra
> service nfs-server start
> mount -t nfs -o vers=4.0 127.0.0.1:/mnt /mnt1
> mount /dev/sda /mnt/sda
> touch /mnt1/sda/file
> exportfs -r
> umount /mnt/sda # failed unexcepted
> 
> [...]

Applied to nfsd-fixes for v6.13, thanks!

[1/5] nfsd: Revert "nfsd: release svc_expkey/svc_export with rcu_work"
      commit: 69d803c40edeaf94089fbc8751c9b746cdc35044

--
Chuck Lever