From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: Eric DeCosta via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Eric Sunshine <sunshine@sunshineco.com>,
Glen Choo <chooglen@google.com>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Taylor Blau <me@ttaylorr.com>,
Eric DeCosta <edecosta@mathworks.com>
Subject: Re: [PATCH v4 2/6] fsmonitor: determine if filesystem is local or remote
Date: Mon, 12 Dec 2022 11:24:27 +0100 [thread overview]
Message-ID: <221212.86lenc6h2l.gmgdl@evledraar.gmail.com> (raw)
In-Reply-To: <e53fc07754094aa5ba8080ec7761869c6429a8af.1669230044.git.gitgitgadget@gmail.com>
On Wed, Nov 23 2022, Eric DeCosta via GitGitGadget wrote:
> From: Eric DeCosta <edecosta@mathworks.com>
>
> Compare the given path to the mounted filesystems. Find the mount that is
> the longest prefix of the path (if any) and determine if that mount is on a
> local or remote filesystem.
>
> Signed-off-by: Eric DeCosta <edecosta@mathworks.com>
> ---
> compat/fsmonitor/fsm-path-utils-linux.c | 186 ++++++++++++++++++++++++
> 1 file changed, 186 insertions(+)
> create mode 100644 compat/fsmonitor/fsm-path-utils-linux.c
>
> diff --git a/compat/fsmonitor/fsm-path-utils-linux.c b/compat/fsmonitor/fsm-path-utils-linux.c
> new file mode 100644
> index 00000000000..d3281422ebc
> --- /dev/null
> +++ b/compat/fsmonitor/fsm-path-utils-linux.c
> @@ -0,0 +1,186 @@
> +#include "fsmonitor.h"
> +#include "fsmonitor-path-utils.h"
> +#include <errno.h>
> +#include <mntent.h>
> +#include <sys/mount.h>
> +#include <sys/vfs.h>
> +#include <sys/statvfs.h>
> +
> +static int is_remote_fs(const char* path) {
> + struct statfs fs;
> +
> + if (statfs(path, &fs)) {
> + error_errno(_("statfs('%s') failed"), path);
> + return -1;
> + }
Nit: Drop the braces and do:
if (statfs(...) == -1)
return error_errno(...)
> + switch (fs.f_type) {
> + case 0x61636673: /* ACFS */
> + case 0x5346414F: /* AFS */
> + case 0x00C36400: /* CEPH */
> + case 0xFF534D42: /* CIFS */
> + case 0x73757245: /* CODA */
> + case 0x19830326: /* FHGFS */
> + case 0x1161970: /* GFS */
> + case 0x47504653: /* GPFS */
> + case 0x013111A8: /* IBRIX */
> + case 0x6B414653: /* KAFS */
> + case 0x0BD00BD0: /* LUSTRE */
> + case 0x564C: /* NCP */
> + case 0x6969: /* NFS */
> + case 0x6E667364: /* NFSD */
> + case 0x7461636f: /* OCFS2 */
> + case 0xAAD7AAEA: /* PANFS */
> + case 0x517B: /* SMB */
> + case 0xBEEFDEAD: /* SNFS */
> + case 0xFE534D42: /* SMB2 */
> + case 0xBACBACBC: /* VMHGFS */
> + case 0xA501FCF5: /* VXFS */
So, before we'd compare against the name, but to avoid the GPLv3
copy/pasting we're now comparing against the fs.f_type.
If we are hardcoding them, our usual convention is to lower-case
hexdigits, so 0xbacbacbc not 0xBACBACBC.
But at least my statfs() manpage documents the named defines in
linux/magic.h for most of these. Why not use those?
> + return 1;
> + default:
> + break;
You could just "return 0" here, and...
> + }
> +
> + return 0;
...drop this "return 0".
> +}
> +
> +static int find_mount(const char *path, const struct statvfs *fs,
> + struct mntent *ent)
Misindentation.
> +{
> + const char *const mounts = "/proc/mounts";
> + const char *rp = real_pathdup(path, 1);
> + struct mntent *ment = NULL;
> + struct statvfs mntfs;
> + FILE *fp;
> + int found = 0;
> + int dlen, plen, flen = 0;
> +
> + ent->mnt_fsname = NULL;
> + ent->mnt_dir = NULL;
> + ent->mnt_type = NULL;
> +
> + fp = setmntent(mounts, "r");
> + if (!fp) {
> + error_errno(_("setmntent('%s') failed"), mounts);
> + return -1;
Ditto "return error_errno()"
> + }
> +
> + plen = strlen(rp);
Let's make "plen", "dlen" and "flen" a "size_t", not "int"
> +
> + /* read all the mount information and compare to path */
> + while ((ment = getmntent(fp)) != NULL) {
Drop the "!= NULL"
> + if (statvfs(ment->mnt_dir, &mntfs)) {
> + switch (errno) {
> + case EPERM:
> + case ESRCH:
> + case EACCES:
> + continue;
> + default:
> + error_errno(_("statvfs('%s') failed"), ment->mnt_dir);
> + endmntent(fp);
Shouldn't we check the endmntent() error too? Now, from the manpage the
interface is funny, and always returns 1.
But since this is linux-specific code it seems safe enough to go with it
& glibc assumptions and:
errno = 0;
endmntent(fp);
if (errno)
return error_errno(....);
I.e. it'll just call fclose(), which might set errno() on failure.
Maybe it's not worth it...
> + if (statvfs(path, &fs))
> + return error_errno(_("statvfs('%s') failed"), path);
Here you do use that "return error_errno(...)" pattern...", yay!
> +
> +
> + if (find_mount(path, &fs, &ment) < 0) {
> + free(ment.mnt_fsname);
> + free(ment.mnt_dir);
> + free(ment.mnt_type);
> + return -1;
> + }
> +
> + trace_printf_key(&trace_fsmonitor,
> + "statvfs('%s') [flags 0x%08lx] '%s' '%s'",
> + path, fs.f_flag, ment.mnt_type, ment.mnt_fsname);
> +
> + fs_info->is_remote = is_remote_fs(ment.mnt_dir);
> + fs_info->typename = ment.mnt_fsname;
> + free(ment.mnt_dir);
> + free(ment.mnt_type);
If you're going to \n\n-seperate this and the trace_printf_key() above I
think moving the second free() here to that "block" would make sense,
sinec here is the last time we use mnt_dir, but the last time we used
mnt_type was in the trace_printf_key().
But...
> +
> + if (fs_info->is_remote < 0) {
> + free(ment.mnt_fsname);
...aren't you NULL init-ing these, why not just for all of these:
goto error;
Then....
> + return -1;
> + }
> +
> + trace_printf_key(&trace_fsmonitor,
> + "'%s' is_remote: %d",
> + path, fs_info->is_remote);
> +
> + return 0;
Have this be:
int ret = -1; /* earlier */
ret = 0;
cleanup:
free(...);
free(...);
return ret;
> +}
> +
> +int fsmonitor__is_fs_remote(const char *path)
> +{
> + struct fs_info fs;
> +
> + if (fsmonitor__get_fs_info(path, &fs))
> + return -1;
> +
> + free(fs.typename);
This will segfault if you take the part through fsmonitor__get_fs_info()
where we don't have the fs.typename yet, i.e. if statfs() fails.
There's the trivial NULL-init way to work around it, but I think this
suggests a leaky abstraction. If we fail to get the fs info, then the
function itself should have free'd that, shouldn't it?
> +/*
> + * No-op for now.
> + */
> +char *fsmonitor__resolve_alias(const char *path,
> + const struct alias_info *info)
Ditto misindentatione
next prev parent reply other threads:[~2022-12-12 10:46 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-09 14:37 [PATCH 00/12] fsmonitor: Implement fsmonitor for Linux Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 01/12] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-10-18 12:29 ` Ævar Arnfjörð Bjarmason
2022-10-09 14:37 ` [PATCH 02/12] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 03/12] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 04/12] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 05/12] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 06/12] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 07/12] fsmonitor: prepare to share code between Mac OS and Linux Eric DeCosta via GitGitGadget
2022-10-09 22:36 ` Junio C Hamano
2022-10-10 16:23 ` Jeff Hostetler
2022-10-09 14:37 ` [PATCH 08/12] fsmonitor: determine if filesystem is local or remote Eric DeCosta via GitGitGadget
2022-10-10 10:04 ` Ævar Arnfjörð Bjarmason
2022-10-14 19:38 ` Eric DeCosta
2022-10-09 14:37 ` [PATCH 09/12] fsmonitor: implement filesystem change listener for Linux Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 10/12] fsmonitor: enable fsmonitor " Eric DeCosta via GitGitGadget
2022-10-09 14:37 ` [PATCH 11/12] fsmonitor: test updates Eric DeCosta via GitGitGadget
2022-10-18 12:42 ` Ævar Arnfjörð Bjarmason
2022-10-09 14:37 ` [PATCH 12/12] fsmonitor: update doc for Linux Eric DeCosta via GitGitGadget
2022-10-18 12:43 ` Ævar Arnfjörð Bjarmason
2022-10-09 22:24 ` [PATCH 00/12] fsmonitor: Implement fsmonitor " Junio C Hamano
2022-10-10 0:19 ` Eric Sunshine
2022-10-10 21:08 ` Junio C Hamano
2022-10-14 21:45 ` [PATCH v2 " Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 01/12] fsmonitor: refactor filesystem checks to common interface Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 02/12] fsmonitor: relocate socket file if .git directory is remote Eric DeCosta via GitGitGadget
2022-10-18 12:12 ` Ævar Arnfjörð Bjarmason
2022-10-14 21:45 ` [PATCH v2 03/12] fsmonitor: avoid socket location check if using hook Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 04/12] fsmonitor: deal with synthetic firmlinks on macOS Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 05/12] fsmonitor: check for compatability before communicating with fsmonitor Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 06/12] fsmonitor: add documentation for allowRemote and socketDir options Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 07/12] fsmonitor: prepare to share code between Mac OS and Linux Eric DeCosta via GitGitGadget
2022-10-14 23:46 ` Junio C Hamano
2022-10-17 21:30 ` Eric DeCosta
2022-10-18 6:31 ` Junio C Hamano
2022-10-14 21:45 ` [PATCH v2 08/12] fsmonitor: determine if filesystem is local or remote Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 09/12] fsmonitor: implement filesystem change listener for Linux Eric DeCosta via GitGitGadget
2022-10-18 11:59 ` Ævar Arnfjörð Bjarmason
2022-10-14 21:45 ` [PATCH v2 10/12] fsmonitor: enable fsmonitor " Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 11/12] fsmonitor: test updates Eric DeCosta via GitGitGadget
2022-10-14 21:45 ` [PATCH v2 12/12] fsmonitor: update doc for Linux Eric DeCosta via GitGitGadget
2022-10-14 23:32 ` [PATCH v2 00/12] fsmonitor: Implement fsmonitor " Junio C Hamano
2022-10-17 21:32 ` Eric DeCosta
2022-10-17 22:22 ` Junio C Hamano
2022-10-18 14:02 ` Johannes Schindelin
2022-10-17 22:14 ` Glen Choo
2022-10-18 4:17 ` Junio C Hamano
2022-10-18 17:03 ` Glen Choo
2022-10-18 17:11 ` Junio C Hamano
2022-10-19 1:19 ` Ævar Arnfjörð Bjarmason
2022-10-19 2:28 ` Eric Sunshine
2022-10-19 16:58 ` Junio C Hamano
2022-10-19 19:11 ` Ævar Arnfjörð Bjarmason
2022-10-19 20:14 ` Eric Sunshine
2022-10-19 1:04 ` Ævar Arnfjörð Bjarmason
2022-10-19 16:33 ` Junio C Hamano
2022-10-20 16:13 ` Junio C Hamano
2022-10-20 16:37 ` Eric Sunshine
2022-10-20 17:01 ` Junio C Hamano
2022-10-20 17:54 ` Eric Sunshine
2022-10-20 15:43 ` Junio C Hamano
2022-10-20 22:01 ` Junio C Hamano
2022-11-16 23:23 ` [PATCH v3 0/6] " Eric DeCosta via GitGitGadget
2022-11-16 23:23 ` [PATCH v3 1/6] fsmonitor: prepare to share code between Mac OS and Linux Eric DeCosta via GitGitGadget
2022-11-16 23:23 ` [PATCH v3 2/6] fsmonitor: determine if filesystem is local or remote Eric DeCosta via GitGitGadget
2022-11-16 23:23 ` [PATCH v3 3/6] fsmonitor: implement filesystem change listener for Linux Eric DeCosta via GitGitGadget
2022-11-16 23:23 ` [PATCH v3 4/6] fsmonitor: enable fsmonitor " Eric DeCosta via GitGitGadget
2022-11-16 23:23 ` [PATCH v3 5/6] fsmonitor: test updates Eric DeCosta via GitGitGadget
2022-11-16 23:23 ` [PATCH v3 6/6] fsmonitor: update doc for Linux Eric DeCosta via GitGitGadget
2022-11-16 23:27 ` [PATCH v3 0/6] fsmonitor: Implement fsmonitor " Taylor Blau
2022-11-23 19:00 ` [PATCH v4 " Eric DeCosta via GitGitGadget
2022-11-23 19:00 ` [PATCH v4 1/6] fsmonitor: prepare to share code between Mac OS and Linux Eric DeCosta via GitGitGadget
2022-11-23 19:00 ` [PATCH v4 2/6] fsmonitor: determine if filesystem is local or remote Eric DeCosta via GitGitGadget
2022-11-25 7:31 ` Junio C Hamano
2022-12-12 10:24 ` Ævar Arnfjörð Bjarmason [this message]
2022-11-23 19:00 ` [PATCH v4 3/6] fsmonitor: implement filesystem change listener for Linux Eric DeCosta via GitGitGadget
2022-12-12 10:42 ` Ævar Arnfjörð Bjarmason
2022-11-23 19:00 ` [PATCH v4 4/6] fsmonitor: enable fsmonitor " Eric DeCosta via GitGitGadget
2022-11-23 19:00 ` [PATCH v4 5/6] fsmonitor: test updates Eric DeCosta via GitGitGadget
2022-11-23 19:00 ` [PATCH v4 6/6] fsmonitor: update doc for Linux Eric DeCosta via GitGitGadget
2022-12-12 21:57 ` [PATCH v5 0/6] fsmonitor: Implement fsmonitor " Eric DeCosta via GitGitGadget
2022-12-12 21:58 ` [PATCH v5 1/6] fsmonitor: prepare to share code between Mac OS and Linux Eric DeCosta via GitGitGadget
2022-12-12 21:58 ` [PATCH v5 2/6] fsmonitor: determine if filesystem is local or remote Eric DeCosta via GitGitGadget
2022-12-12 21:58 ` [PATCH v5 3/6] fsmonitor: implement filesystem change listener for Linux Eric DeCosta via GitGitGadget
2022-12-12 21:58 ` [PATCH v5 4/6] fsmonitor: enable fsmonitor " Eric DeCosta via GitGitGadget
2022-12-12 21:58 ` [PATCH v5 5/6] fsmonitor: test updates Eric DeCosta via GitGitGadget
2022-12-12 21:58 ` [PATCH v5 6/6] fsmonitor: update doc for Linux Eric DeCosta via GitGitGadget
2023-04-12 5:42 ` [PATCH v5 0/6] fsmonitor: Implement fsmonitor " Junio C Hamano
2022-10-18 12:47 ` [PATCH 00/12] " Ævar Arnfjörð Bjarmason
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=221212.86lenc6h2l.gmgdl@evledraar.gmail.com \
--to=avarab@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=chooglen@google.com \
--cc=edecosta@mathworks.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=me@ttaylorr.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.