Linux kernel LOCK_MAND deprecation

Jeremy Allison jra at samba.org
Mon Sep 13 17:40:50 UTC 2021


On Mon, Sep 13, 2021 at 10:02:01AM -0400, Jeff Layton via samba-technical wrote:
>I recently proposed a patch to remove most of the support for
>flock(..., LOCK_MAND...) from the Linux kernel. The code in question has
>been broken for well over a decade, such that trying to use LOCK_MAND
>flock locks is really just a no-op:
>
>    https://lore.kernel.org/linux-fsdevel/20210910201915.95170-1-jlayton@kernel.org/
>
>Samba references that symbol in kernel_flock(). I started to take a look
>at removing the code from samba, but the work kind of snowballed with
>all of the wrappers and indirection.
>
>Would anyone who is actively working on samba want to take a stab at
>removing kernel_flock()? It should be safe to just rip it out since it
>hasn't worked in ages.
>
>If it's not removed, then you may see kernel warnings on Linux when
>samba tries to set a LOCK_MAND lock, a'la:
>
>   pr_warn_once("Attempt to set a LOCK_MAND lock via flock(2). This support has been removed and the request ignored.\n");

So the only code that sets it is in source3/smbd/open.c:

4048         if (!fsp->fsp_flags.is_pathref &&
4049             fsp_get_io_fd(fsp) != -1 &&
4050             lp_kernel_share_modes(SNUM(conn)))
4051         {
4052                 int ret_flock;
4053                 /*
4054                  * Beware: streams implementing VFS modules may
4055                  * implement streams in a way that fsp will have the
4056                  * basefile open in the fsp fd, so lacking a distinct
4057                  * fd for the stream kernel_flock will apply on the
4058                  * basefile which is wrong. The actual check is
4059                  * deferred to the VFS module implementing the
4060                  * kernel_flock call.
4061                  */
4062                 ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, share_access, access_mask);
4063                 if(ret_flock == -1 ){
4064 
4065                         del_share_mode(lck, fsp);
4066                         TALLOC_FREE(lck);
4067                         fd_close(fsp);
4068 
4069                         return NT_STATUS_SHARING_VIOLATION;
4070                 }
4071 
4072                 fsp->fsp_flags.kernel_share_modes_taken = true;
4073         }

and removes it in source3/smbd/close.c:

454         if (fsp->fsp_flags.kernel_share_modes_taken) {
  455                 int ret_flock;
  456 
  457                 /*
  458                  * A file system sharemode could block the unlink;
  459                  * remove filesystem sharemodes first.
  460                  */
  461                 ret_flock = SMB_VFS_KERNEL_FLOCK(fsp, 0, 0);
  462                 if (ret_flock == -1) {
  463                         DBG_INFO("removing kernel flock for %s failed: %s\n",
  464                                   fsp_str_dbg(fsp), strerror(errno));
  465                 }
  466 
  467                 fsp->fsp_flags.kernel_share_modes_taken = false;
  468         }

(and a couple of other places that do the same thing on close).

The rest is just boilerplace VFS glue that allows the VFS call:

         int (*kernel_flock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
                                uint32_t share_access, uint32_t access_mask);

to be caught by all VFS modules. It's not too hard to rip out
for 4.16.x (too late for a VFS change in 4.15.0).

The only question I have, is this being used in IBM gpfs at all ?

As far as I recall, that was the only real user of this functionality.

I'm CC:ing Volker and Ralph for their comments. If they agree it
can go I can whip up a patchset removing it reasonably quickly.

Volker, Ralph, thoughts ?

Jeremy.



More information about the samba-technical mailing list