Re: Why to fork so many times?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tuesday 07 June 2011 02:08 PM, Daniel wrote:
Thank you, Pavan. It clarifies most of my doubts.

Only I can't find the branch of 'if sync-mtab == 1'. And I thought it
was without "YES fork()". Could you explain more about that, please?


Oh, the variable mtab_pid is what indicates whether the sync-mtab option is set or not. Trace back the caller of fuse_mnt_add_mount(). The call stack looks like below;

fuse_bridge.c:init() -> gf_fuse_mount() -> fuse_mount_sys() -> fuse_mnt_add_mount().

In gf_fuse_mount(), the last parameter is passed as :
sync_mtab ? &ctx->mtab_pid : NULL
So, if the "sync-mtab" option is set, mtab_pid will be non-NULL. Otherwise it will be NULL.

Now you can relate back to the condition in fuse_mnt_add_mount().
If mtab_pid is NULL, the "NO" condition in the flow-chart I provided comes into picture. Otherwise the code follows the YES condition.

Pavan

Thanks a lot.

Dan

On Tue, 2011-06-07 at 12:29 +0530, Pavan T C wrote:
On Tuesday 07 June 2011 10:54 AM, Daniel wrote:
Hello hackers:

I am learning glusterfs and get one question when I reading
contrib/fuse-lib/mount.c fuse_mnt_add_mount(). Why does it fork four
times and the grand-grand-child exec("/bin/mount")? What is the benefit
and the consideration?

As I see it, it forks thrice. Here is what I understand from the code:

+---------------------+
| fuse_mnt_add_mount()|<------------------------------+
| fork and wait for   |                               |
| child to return     |                               |
+-----+---------------+                               |
        |                                               |
        |                                               |
        X                                               |
       / \                                              |
      /if \                                             |
     /sync-\    NO    +---------------------------+     |
    X mtab  X-------->| Do async ops by returning |     |
     \ == 1/   fork() | from here so that parent  |     |
      \   /           | does not wait. But before |     |
       \ /            | doing that, create a dummy|     |
        X             | parent to wait for child  |     |
        | YES         | that does the /bin/mount  |     |
        |             +------------+--------------+     |
        | fork()                   |                    |
        V                          |                    |
+-----+----------+               | fork() ->  Parent returns here.
| Child: execl   |               v
| /bin/mount with|         +---------------+
| -f option to   |         |dummy parent:  |
| only populate  |  fork() | fork and wait |
| mtab but don't |<--------+ for /bin/mount|
| actually mount |         | to return     |
| anything.      |         +---------------+
+----------------+

HTH,
Pavan


Thank you

Daniel


_______________________________________________
Gluster-devel mailing list
Gluster-devel@xxxxxxxxxx
https://lists.nongnu.org/mailman/listinfo/gluster-devel







[Index of Archives]     [Gluster Users]     [Ceph Users]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux