{"thread":{"id":"9057","subject":"\"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","startedAt":"2007-07-16T10:08:03Z","lastAt":"2007-07-18T18:15:24Z","messageCount":25,"participants":["Thomas Glanzmann","David Kastrup","Johannes Sixt","Brian Downing","Linus Torvalds"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"47526","messageId":"20070716100803.GA24036@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":null,"subject":"\"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T10:08:03Z","receivedAt":"2007-07-16T10:08:03Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\nwhen I call \"git clone ~adglth0/work/scripts whatever\" as user\neverything works as expected. As soon as I call this command as root it\nshreds ufs:\n\n        (s092942) [~] git version\n        git version 1.5.3.GIT\n        (s092942) [~] git clone ~adglth0/work/scripts nonroot\n        Initialized empty Git repository in /export/home/adglth0/nonroot/.git/\n        remote: Generating pack...\n        Done counting 220 objects.\n        Deltifying 220 objects...\n        2% (5/220) doneIndexing 220 objects...\n        100% (220/220) done20) donedonedone\n        Total 220 (delta 114), reused 181remote:  (delta 88)\n        100% (220/220) done\n        Resolving 114 deltas...\n        100% (114/114) done\n        (s092942) [~] cd nonroot\n        ./nonroot\n        (s092942) [~/nonroot] git status\n        # On branch master\n        nothing to commit (working directory clean)\n        (s092942) [~/nonroot] fg\n        sudo ${SHELL} --rcfile ${HOME}/.bash_profile    (wd: ~)\n        (s092942) [~] git clone ~adglth0/work/scripts root\n        DO *NOT* RUN GIT AS ROOT clone /export/home/adglth0/work/scripts root\n        (s092942) [~] unalias git\n        (s092942) [~] git clone ~adglth0/work/scripts root\n        Initialized empty Git repository in /export/home/adglth0/root/.git/\n        remote: Generating pack...\n        remote: Done counting 220 objects.\n        Deltifying 220 objects...\n        3% (7/220) doneIndexing 220 objects...\n        100% (220/220) done20) done0) done\n        Total 220 (delta 114), reused 181 (delta 88)\n        100% (220/220) done\n        Resolving 114 deltas...\n        100% (114/114) done\n        (s092942) [~] cd root\n        (s092942) [~/root] git status\n        # On branch master\n        # Changed but not updated:\n        #   (use \"git add/rm <file>...\" to update what will be committed)\n        #\n        #       deleted:    eclogic/acct_per_host.pl\n        #       deleted:    eclogic/check_3ware\n        #       deleted:    eclogic/check_ipmi.pl\n        #       deleted:    eclogic/check_load.pl\n        #       deleted:    eclogic/create_nagios_config.pl\n        #       deleted:    eclogic/mailrelay/config-2.6.20\n        #       deleted:    eclogic/mailrelay/interfaces\n        #       deleted:    eclogic/on_all_hosts.pl\n        #       deleted:    lifebook/kernel-config\n        #       deleted:    s017241/config-2.6.20\n        #       deleted:    s017241/firewall\n        #       deleted:    s017241/siemens.conf\n        #       deleted:    siemens/aliasupdate-tg\n        #       deleted:    siemens/check_raid.sh\n        #       deleted:    siemens/create_nagios_config.pl\n        #       deleted:    siemens/crontab_client\n        #       deleted:    siemens/deploy\n        #       deleted:    siemens/generate_password.pl.gpg\n        #       deleted:    siemens/mail_verrechnung.pl\n        #       deleted:    siemens/oracle_beispiel_client.pl\n        #       deleted:    siemens/sar_deploy.pl\n        #       deleted:    siemens/t3_check_via_telnet.pl\n        #       deleted:    thinkpad/config-2.6.20\n        #       deleted:    thinkpad/fglrx.patch\n        #       deleted:    thinkpad/network-please\n        #       deleted:    thinkpad/xorg/build\n        #       deleted:    webfarm/config-2.6.20\n        #\n        no changes added to commit (use \"git add\" and/or \"git commit -a\")\n        (s092942) [~/root] git checkout -f HEAD\n        (s092942) [~/root] git status\n        # On branch master\n        # Changed but not updated:\n        #   (use \"git add/rm <file>...\" to update what will be committed)\n        #\n        #       deleted:    eclogic/acct_per_host.pl\n        #       deleted:    eclogic/check_3ware\n        #       deleted:    eclogic/check_ipmi.pl\n        #       deleted:    eclogic/check_load.pl\n        #       deleted:    eclogic/create_nagios_config.pl\n        #       deleted:    eclogic/mailrelay/config-2.6.20\n        #       deleted:    eclogic/mailrelay/interfaces\n        #       deleted:    eclogic/sms.pl\n        #       deleted:    lifebook/network-please\n        #       deleted:    s017241/config-2.6.20\n        #       deleted:    s017241/firewall\n        #       deleted:    s017241/xorg.conf\n        #       deleted:    siemens/aliasupdate-tg\n        #       deleted:    siemens/check_raid.sh\n        #       deleted:    siemens/create_nagios_config.pl\n        #       deleted:    siemens/crontab_client\n        #       deleted:    siemens/deploy\n        #       deleted:    siemens/generate_password.pl.gpg\n        #       deleted:    siemens/mail_verrechnung.pl\n        #       deleted:    siemens/oracle_beispiel_client.pl\n        #       deleted:    siemens/sar_deploy.pl\n        #       deleted:    siemens/tryserver.sh\n        #       deleted:    thinkpad/config-2.6.20\n        #       deleted:    thinkpad/fglrx.patch\n        #       deleted:    thinkpad/network-please\n        #       deleted:    thinkpad/xorg/cleanup\n        #       deleted:    webfarm/unsplit.pl\n        #\n        no changes added to commit (use \"git add\" and/or \"git commit -a\")\n        (s092942) [~/root] ls\n        eclogic/   leo*       lifebook/  s017241/   siemens/   thinkpad/  webfarm/\n        (s092942) [~/root] ls siemens/\n        t3_check_via_telnet.pl*\n        (s092942) [~/root] cd ..\n        (s092942) [~] rm -rf root/\n        rm: Unable to remove directory root/: File exists\n        (s092942) [~] find root/\n        root/\n        (s092942) [~] ls -al root/\n        total 6\n        drwxr-xr-x  56 root     root         512 Jul 16 11:48 ./\n        drwxr-xr-x  17 adglth0  root        1536 Jul 16 11:48 ../\n        (s092942) [~] df -h .\n        Filesystem             size   used  avail capacity  Mounted on\n        /dev/dsk/c0t0d0s7       75G   9.0G    65G    13%    /export/home\n        (s092942) [~] ls -ali root/\n        total 6\n        13657 drwxr-xr-x  56 root     root         512 Jul 16 11:48 ./\n        5829 drwxr-xr-x  17 adglth0  root        1536 Jul 16 11:48 ../\n        (s092942) [~] gfind /export/home -xdev -inum 13657\n        /export/home/adglth0/root\n        (s092942) [~]\n\nA few notes and observations I did. Linux _does_ not allow userland to\ncreate hardlinks for directories which makes totally sense. Solaris does\nallow the _root_ user to allow hardlinks for directories. There is even\na command that makes that possible:\n\n        (faui04a) [/var/tmp] mkdir test\n        (faui04a) [/var/tmp] /usr/xpg4/bin/link test bla\n        (faui04a) [/var/tmp] ls -ali\n        total 13\n        1639 drwxrwxrwt    4 root     sys          9216 Jul 16 11:13 ./\n        4 drwxr-xr-x   48 root     sys          1024 Jan  1  2007 ../\n        238939 drwx--x--x    3 snalwuer icipguru      512 Jul  5 19:08 1071895580/\n        238945 drwxr-xr-x    3 root     root          512 Jul 16 11:11 bla/\n        238945 drwxr-xr-x    3 root     root          512 Jul 16 11:11 test/\n        (faui04a) [/var/tmp] find . -inum 238945\n\nWhatever. My first impression was that the filesystem of the solaris is\nbroken. So I fscked it. And guess what it corrected the error. But after\nthe reboot I tried it again and you see the result above. So my guess is\nthat git calls the link system call in a way Solaris thinks it should\nitself shoot in the head. This also happens with _remote_ clones as\nroot:\n\n        (s092942) [~] git clone adglth0@157.163.208.106:/home/adglth0/work/scripts second_test_as_root\n        Initialized empty Git repository in /export/home/adglth0/second_test_as_root/.git/\n        The authenticity of host '157.163.208.106 (157.163.208.106)' can't be established.\n        RSA key fingerprint is 72:27:be:82:f7:71:e5:23:a6:b6:57:a9:11:dd:26:26.\n        Are you sure you want to continue connecting (yes/no)? yes\n        Warning: Permanently added '157.163.208.106' (RSA) to the list of known hosts.\n        remote: Generating pack...\n        remote: Done counting 220 objects.\n        remote: Deltifying 220 objects...\n        remote:  100% (220/220) done\n        Indexing 220 objects...\n        remote: Total 220 (delta 115), reused 37 (delta 9)\n        100% (220/220) done\n        Resolving 115 deltas...\n        100% (115/115) done\n        (s092942) [~] cd second_test_as_root/\n        ./second_test_as_root/\n        (s092942) [~/second_test_as_root] git status\n        # On branch master\n        # Changed but not updated:\n        #   (use \"git add/rm <file>...\" to update what will be committed)\n        #\n        #       deleted:    eclogic/acct_per_host.pl\n        #       deleted:    eclogic/check_3ware\n        #       deleted:    eclogic/check_ipmi.pl\n        #       deleted:    eclogic/check_load.pl\n        #       deleted:    eclogic/create_nagios_config.pl\n        #       deleted:    eclogic/mailrelay/config-2.6.20\n        #       deleted:    eclogic/mailrelay/interfaces\n        #       deleted:    eclogic/on_all_hosts.pl\n        #       deleted:    lifebook/kernel-config\n        #       deleted:    s017241/config-2.6.20\n        #       deleted:    s017241/firewall\n        #       deleted:    s017241/siemens.conf\n        #       deleted:    siemens/aliasupdate-tg\n        #       deleted:    siemens/check_raid.sh\n        #       deleted:    siemens/create_nagios_config.pl\n        #       deleted:    siemens/crontab_client\n        #       deleted:    siemens/deploy\n        #       deleted:    siemens/generate_password.pl.gpg\n        #       deleted:    siemens/mail_verrechnung.pl\n        #       deleted:    siemens/oracle_beispiel_client.pl\n        #       deleted:    siemens/sar_deploy.pl\n        #       deleted:    siemens/t3_check_via_telnet.pl\n        #       deleted:    thinkpad/config-2.6.20\n        #       deleted:    thinkpad/fglrx.patch\n        #       deleted:    thinkpad/network-please\n        #       deleted:    thinkpad/xorg/build\n        #       deleted:    webfarm/config-2.6.20\n        #\n        no changes added to commit (use \"git add\" and/or \"git commit -a\")\n        (s092942) [~/second_test_as_root] uname -a\n        SunOS s092942 5.10 Generic_118833-17 sun4u sparc SUNW,Sun-Blade-100\n\nSo has anyone a idea what is wrong. I have shareded a second machine in\na complete different domain. With a complete different git version. Same\nthing. So it is not the hardware and not the specific git version and\nnot the Solaris version:\n\n        (faui04a) [/var/tmp] git clone ~sithglan/work/sc\n        screen/                       scripts/                      scripts_ccbank_what_the_hell/\n        (faui04a) [/var/tmp] git clone ~sithglan/work/repositories/\n        private/ public/\n        (faui04a) [/var/tmp] git clone ~sithglan/work/repositories/public/\n        blastwave.git/ bs.git/        easix.git/     mutt.git/      nzb.git/       ra.git/        watchdog.git/\n        (faui04a) [/var/tmp] git clone ~sithglan/work/repositories/public/easix.git/\n        DO *NOT* RUN GIT AS ROOT clone /home/cip/adm/sithglan/work/repositories/public/easix.git/\n        (faui04a) [/var/tmp] unalias git\n        (faui04a) [/var/tmp] git clone ~sithglan/work/repositories/public/easix.git/\n        Initialized empty Git repository in /var/tmp/easix/.git/\n        remote: Generating pack...\n        remote: Done counting 317 objects.\n        remote: Deltifying 317 objects...\n        remote: emote: 317/317) done: ) done17) done\n        Indexing 317 objects...\n        remote: Total 317 (delta 182), reused 278 (delta 157)\n        100% (317/317) done\n        Resolving 182 deltas...\n        100% (182/182) done\n\n        (faui04a) [/var/tmp] cd easix/\n        ./easix/\n        (faui04a) [/var/tmp/easix] git status\n        # On branch master\n        # Changed but not updated:\n        #   (use \"git add/rm <file>...\" to update what will be committed)\n        #\n        #       deleted:    profiles/icpc\n        #       deleted:    profiles/sithglan\n        #       deleted:    sources/boot.msg\n        #       deleted:    sources/busybox-config\n        #       deleted:    sources/config\n        #       deleted:    sources/easix.logo.16\n        #       deleted:    sources/easixdm\n        #       deleted:    sources/f2\n        #       deleted:    sources/home-faumachine.tar.gz\n        #       deleted:    sources/home-icpc.tar.gz\n        #       deleted:    sources/home-simigern.tar.gz\n        #       deleted:    sources/home-sithglan.tar.gz\n        #       deleted:    sources/home-sitowert.tar.gz\n        #       deleted:    sources/linuxrc\n        #       deleted:    sources/rc.local\n        #\n        no changes added to commit (use \"git add\" and/or \"git commit -a\")\n        (faui04a) [/var/tmp/easix] cd ..\n        (faui04a) [/var/tmp] rm -rf easix\n        rm: Unable to remove directory easix: File exists\n        (faui04a) [/var/tmp] ls -ali easix/\n        total 10\n        238947 drwxr-xr-x   17 root     root          512 Jul 16 12:01 ./\n        1639 drwxrwxrwt    5 root     sys          9216 Jul 16 12:01 ../\n        (faui04a) [/var/tmp] git version\n        git version 1.5.2\n        (faui04a) [/var/tmp] uname -a\n        SunOS faui04a 5.10 Generic_118833-24 sun4u sparc SUNW,Sun-Fire-280R\n\n\n[ I am off the net for 30 mintues ... eating ]\n\n                Thomas\n"},{"id":"47530","messageId":"20070716104342.GB24036@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"20070716100803.GA24036@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T10:43:42Z","receivedAt":"2007-07-16T10:43:42Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\nI narrowed it down. It is in \"git checkout\" if I copy the \".git\" dir via\n\"cp -a\" and type in \"git checkout\" it breaks. And it _only_ breaks for\nsubdirectories:\n\n        (faui04a) [/var/tmp/shit] git checkout\n        D       profiles/icpc\n        D       profiles/sithglan\n        D       sources/boot.msg\n        D       sources/busybox-config\n        D       sources/config\n        D       sources/easix.logo.16\n        D       sources/easixdm\n        D       sources/f2\n        D       sources/home-faumachine.tar.gz\n        D       sources/home-icpc.tar.gz\n        D       sources/home-simigern.tar.gz\n        D       sources/home-sithglan.tar.gz\n        D       sources/home-sitowert.tar.gz\n        D       sources/linuxrc\n        D       sources/rc.local\n\nand I also see that _one_ file in each subdirectory is checked out but the\nothers are not.\n\n        Thomas\n"},{"id":"47531","messageId":"86ejj8aakq.fsf@lola.quinscape.zz","threadId":"9057","inReplyTo":"20070716104342.GB24036@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"David Kastrup","fromEmail":"dak@gnu.org","sentAt":"2007-07-16T10:48:21Z","receivedAt":"2007-07-16T10:48:21Z","isPatch":false,"sender":{"key":"dak@gnu.org","avatar":"https://avatars.githubusercontent.com/u/52141349?v=4"},"body":"Thomas Glanzmann <thomas@glanzmann.de> writes:\n\n> Hello,\n> I narrowed it down. It is in \"git checkout\" if I copy the \".git\" dir via\n> \"cp -a\" and type in \"git checkout\" it breaks. And it _only_ breaks for\n> subdirectories:\n>\n>         (faui04a) [/var/tmp/shit] git checkout\n>         D       profiles/icpc\n>         D       profiles/sithglan\n>         D       sources/boot.msg\n>         D       sources/busybox-config\n>         D       sources/config\n>         D       sources/easix.logo.16\n>         D       sources/easixdm\n>         D       sources/f2\n>         D       sources/home-faumachine.tar.gz\n>         D       sources/home-icpc.tar.gz\n>         D       sources/home-simigern.tar.gz\n>         D       sources/home-sithglan.tar.gz\n>         D       sources/home-sitowert.tar.gz\n>         D       sources/linuxrc\n>         D       sources/rc.local\n>\n> and I also see that _one_ file in each subdirectory is checked out but the\n> others are not.\n\nOk, stupidly trying one of our most frequently encountered problems:\n\nDoes it help to say\nexport CDPATH=\"\"\nin your root shell?\n\n-- \nDavid Kastrup\n"},{"id":"47532","messageId":"86644kaaf1.fsf@lola.quinscape.zz","threadId":"9057","inReplyTo":"20070716104342.GB24036@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"David Kastrup","fromEmail":"dak@gnu.org","sentAt":"2007-07-16T10:51:46Z","receivedAt":"2007-07-16T10:51:46Z","isPatch":false,"sender":{"key":"dak@gnu.org","avatar":"https://avatars.githubusercontent.com/u/52141349?v=4"},"body":"Thomas Glanzmann <thomas@glanzmann.de> writes:\n\n> Hello,\n> I narrowed it down. It is in \"git checkout\" if I copy the \".git\" dir via\n> \"cp -a\" and type in \"git checkout\" it breaks. And it _only_ breaks for\n> subdirectories:\n\nAnother guess: cp -a copies files preserving all permissions and\nownerships (which works only as root).  Nominally, the files now don't\nbelong to you, and some scripts might take you by the word even if\nthey _could_ just overwrite things if they actually tried.  Try\nmaking\n\nchown -R root.root .git\n\non your tree and see whether this makes git more comfortable.\n\n-- \nDavid Kastrup\n"},{"id":"47539","messageId":"20070716123510.GI24036@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"86ejj8aakq.fsf@lola.quinscape.zz","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T12:35:10Z","receivedAt":"2007-07-16T12:35:10Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello David,\n\n> Does it help to say export CDPATH=\"\" in your root shell?\n\nno. The problem is triggered by \"git-checkout-index -a -f\" so my CDPATH has\nabsolutly _nothing_ todo with it:\n\n        (faui04a) [/var/tmp] mkdir -p test-4/.git\n        (faui04a) [/var/tmp] cd test-4\n        (faui04a) [/var/tmp/test-4] gcp -a ~/work/repositories/public/easix.git/* .git/\n        (faui04a) [/var/tmp/test-4] git-read-tree HEAD\n        (faui04a) [/var/tmp/test-4] git-checkout-index -a -f\n        (faui04a) [/var/tmp/test-4] git status\n        fatal: /usr/bin/git-status cannot be used without a working tree.\n        (faui04a) [/var/tmp/test-4] rm .git/config\n        (faui04a) [/var/tmp/test-4] git status\n        # On branch master\n        # Changed but not updated:\n        #   (use \"git add/rm <file>...\" to update what will be committed)\n        #\n        #       deleted:    profiles/icpc\n        #       deleted:    profiles/sithglan\n        #       deleted:    sources/boot.msg\n        #       deleted:    sources/busybox-config\n        #       deleted:    sources/config\n        #       deleted:    sources/easix.logo.16\n        #       deleted:    sources/easixdm\n        #       deleted:    sources/f2\n        #       deleted:    sources/home-faumachine.tar.gz\n        #       deleted:    sources/home-icpc.tar.gz\n        #       deleted:    sources/home-simigern.tar.gz\n        #       deleted:    sources/home-sithglan.tar.gz\n        #       deleted:    sources/home-sitowert.tar.gz\n        #       deleted:    sources/linuxrc\n        #       deleted:    sources/rc.local\n        #\n        no changes added to commit (use \"git add\" and/or \"git commit -a\")\n        (faui04a) [/var/tmp/test-4] cd ..\n        (faui04a) [/var/tmp] rm -rf test-4\n        rm: Unable to remove directory test-4: File exists\n        (faui04a) [/var/tmp]\n\n                Thomas\n"},{"id":"47540","messageId":"20070716123913.GJ24036@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"86644kaaf1.fsf@lola.quinscape.zz","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T12:39:13Z","receivedAt":"2007-07-16T12:39:13Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello David,\nas I mentioned and showed in my original e-mail:\n\n        git checkout /path/to/repo\n\ntriggers the problem also. So no, \"cp -a\" has nothing todo with it\nbecause root is able to read _all_ files no matter who the files are\nowned by and what the permissions of these files are[1]. This happens on\na _local_ fileystem. And what worries me is that git does something that\nbreaks the _hard link counter_ of a directory.\n\n        Thomas\n\n[1] Notes\n        Of course that doesn't apply to all filesystems. For example AFS\n        and NFS. But as I said before it happens on a _UFS_ filesystem.\n"},{"id":"47542","messageId":"20070716124604.GK24036@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"20070716100803.GA24036@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T12:46:04Z","receivedAt":"2007-07-16T12:46:04Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello again,\nit is definitively \"git-checkout-index -a -f\":\n\ntruss output is at http://wwwcip.informatik.uni-erlangen.de/~sithglan/git_checkout_index_a_f.truss.gz\n\n        Thomas\n"},{"id":"47543","messageId":"86myxw8pzg.fsf@lola.quinscape.zz","threadId":"9057","inReplyTo":"20070716123913.GJ24036@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"David Kastrup","fromEmail":"dak@gnu.org","sentAt":"2007-07-16T12:58:27Z","receivedAt":"2007-07-16T12:58:27Z","isPatch":false,"sender":{"key":"dak@gnu.org","avatar":"https://avatars.githubusercontent.com/u/52141349?v=4"},"body":"Thomas Glanzmann <thomas@glanzmann.de> writes:\n\n> Hello David,\n> as I mentioned and showed in my original e-mail:\n>\n>         git checkout /path/to/repo\n>\n> triggers the problem also. So no, \"cp -a\" has nothing todo with it\n> because root is able to read _all_ files no matter who the files are\n> owned by and what the permissions of these files are[1]. This happens on\n> a _local_ fileystem. And what worries me is that git does something that\n> breaks the _hard link counter_ of a directory.\n\nHm?  The hard link counter is \"broken\" by creating or not creating\nsubdirectories, since their \"..\" is a hard link.\n\n-- \nDavid Kastrup\n"},{"id":"47544","messageId":"20070716131537.GA26675@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"86myxw8pzg.fsf@lola.quinscape.zz","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T13:15:37Z","receivedAt":"2007-07-16T13:15:37Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello David,\n\n> Hm?  The hard link counter is \"broken\" by creating or not creating\n> subdirectories, since their \"..\" is a hard link.\n\nexactly. The question is: Is it a Solaris bug or is it something that is\nsupposed a user is able to do (it doesn't make sense for me)? I posted\nthis problem to comp.unix.solaris and also contacted the UFS Maintainer\nof Solaris (it is not the first UFS bug I original found). If I don't\nreceive feedback, I am going to open a call with Sun. Whatever is going\non (hopefully it isn't PEBKAC - but I don't think so) and this time it\nisn't broken hardware either (like the last time I reported a serious\ngit bug) because it happens on two machines.\n\n        Thomas\n"},{"id":"47548","messageId":"20070716133602.GB26675@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"20070716100803.GA24036@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T13:36:02Z","receivedAt":"2007-07-16T13:36:02Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\nmight that be related to the problem:\n\n\n        lstat64(\"profiles/icpc\", 0xFFBFF350)            Err#2 ENOENT\n=>       mkdir(\"profiles\", 0777)                         = 0\n        stat64(\".git/objects/66/6197b02f46c92f0273f16ac77d34d76b28f4f0\",\n        0xFFBFF088) = 0\n        open64(\".git/objects/66/6197b02f46c92f0273f16ac77d34d76b28f4f0\",\n        O_RDONLY) = 4\n        mmap64(0x00000000, 284, PROT_READ, MAP_PRIVATE, 4, 0) = 0xFF230000\n        close(4)                                        = 0\n        munmap(0xFF230000, 284)                         = 0\n        open64(\"profiles/icpc\", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4\n        open64(\"profiles/.gitattributes\", O_RDONLY)     Err#2 ENOENT\n        write(4, \" #   I C P C   P r o f i\".., 420)     = 420\n        close(4)                                        = 0\n        lstat64(\"profiles/sithglan\", 0xFFBFF350)        Err#2 ENOENT\n=>      mkdir(\"profiles\", 0777)                         Err#17 EEXIST\n=>      unlink(\"profiles\")                              = 0\n=>      mkdir(\"profiles\", 0777)                         = 0\n\nI think it is. Damn it. What seems to hapen here is that git does:\n\n        - create a subdirectory\n        - puts a file in\n        - deletes a subdirectory (by call unlink - that would normally fail,\n          but with solaris as root it does not fail)\n\n                => here comes the dangling hard link counter\n\n        - created the directory again\n        - puts the file in\n\nThat is why I only see one file in each subdirectory (the one that got\ncheckedout last). So the fix for git should be straight forward. But I still\nthink that Solaris is obviously broken. Because if you ask me it should not be\npossible to unlink a directory that has files in it?!\n\n                Thomas\n"},{"id":"47549","messageId":"20070716134529.GC26675@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"20070716100803.GA24036@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T13:45:29Z","receivedAt":"2007-07-16T13:45:29Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\n\nentry.c line 17:\n\n        static void create_directories(const char *path, const struct checkout *state)\n        {\n        ...\n                        if (mkdir(buf, 0777)) {\n=>                              if (errno == EEXIST) {\n                                        struct stat st;\n=>                                      if (len > state->base_dir_len && state->force && !unlink(buf) && !mkdir(buf, 0777))\n                                                continue;\n                                        if (!stat(buf, &st) && S_ISDIR(st.st_mode))\n                                                continue; /* ok */\n                                }\n                                die(\"cannot create directory at %s\", buf);\n                        }\n        ...\n\nI think here is the problem. I don't understand what the code should do\nactually. Or why the directory is deleted and re-created (maybe something todo\nwith permissions)?\n\n        Thomas\n"},{"id":"47550","messageId":"469B821E.85E5EDA9@eudaptics.com","threadId":"9057","inReplyTo":"20070716134529.GC26675@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it ispossible to create hardlinks for directories as root under solaris)","fromName":"Johannes Sixt","fromEmail":"j.sixt@eudaptics.com","sentAt":"2007-07-16T14:35:10Z","receivedAt":"2007-07-16T14:35:10Z","isPatch":false,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Thomas Glanzmann wrote:\n>         static void create_directories(const char *path, const struct checkout *state)\n>         {\n>         ...\n>                         if (mkdir(buf, 0777)) {\n> =>                              if (errno == EEXIST) {\n>                                         struct stat st;\n> =>                                      if (len > state->base_dir_len && state->force && !unlink(buf) && !mkdir(buf, 0777))\n>                                                 continue;\n>                                         if (!stat(buf, &st) && S_ISDIR(st.st_mode))\n>                                                 continue; /* ok */\n>                                 }\n>                                 die(\"cannot create directory at %s\", buf);\n>                         }\n>         ...\n> \n> I think here is the problem. I don't understand what the code should do\n> actually. Or why the directory is deleted and re-created (maybe something todo\n> with permissions)?\n\nIt tries to remove a *file* that is in the way and create the directory\nin its place. But since your unlink() behaves incorrectly (it is\nsupposed to *fail* for directories), the logic does not quite work as\nexpected - it mistakes the directory for a file.\n\nTry swapping the two inner-most if-blocks.\n\n-- Hannes\n"},{"id":"47551","messageId":"20070716154559.GD19073@lavos.net","threadId":"9057","inReplyTo":"469B821E.85E5EDA9@eudaptics.com","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it ispossible to create hardlinks for directories as root under solaris)","fromName":"Brian Downing","fromEmail":"bdowning@lavos.net","sentAt":"2007-07-16T15:45:59Z","receivedAt":"2007-07-16T15:45:59Z","isPatch":false,"sender":{"key":"bdowning@lavos.net","avatar":"https://avatars.githubusercontent.com/u/366426?v=4"},"body":"On Mon, Jul 16, 2007 at 04:35:10PM +0200, Johannes Sixt wrote:\n> It tries to remove a *file* that is in the way and create the directory\n> in its place. But since your unlink() behaves incorrectly (it is\n> supposed to *fail* for directories), the logic does not quite work as\n> expected - it mistakes the directory for a file.\n\nhttp://www.opengroup.org/onlinepubs/007908799/xsh/unlink.html\n\n| The path argument must not name a directory unless the process has\n| appropriate privileges and the implementation supports using unlink() on\n| directories.\n\nThe above seems to imply that implementations are free to do something\nwith directories passed to unlink, and that it is the responsibility\nif the user not to do that unless they know what is going to happen.\n\n-bcd\n"},{"id":"47552","messageId":"20070716155028.GE19073@lavos.net","threadId":"9057","inReplyTo":"20070716154559.GD19073@lavos.net","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it ispossible to create hardlinks for directories as root under solaris)","fromName":"Brian Downing","fromEmail":"bdowning@lavos.net","sentAt":"2007-07-16T15:50:28Z","receivedAt":"2007-07-16T15:50:28Z","isPatch":false,"sender":{"key":"bdowning@lavos.net","avatar":"https://avatars.githubusercontent.com/u/366426?v=4"},"body":"On Mon, Jul 16, 2007 at 10:45:59AM -0500, Brian Downing wrote:\n> http://www.opengroup.org/onlinepubs/007908799/xsh/unlink.html\n> \n> | The path argument must not name a directory unless the process has\n> | appropriate privileges and the implementation supports using unlink() on\n> | directories.\n> \n> The above seems to imply that implementations are free to do something\n> with directories passed to unlink, and that it is the responsibility\n> if the user not to do that unless they know what is going to happen.\n\nAlso, the HISTORY section of the FreeBSD manpages states:\n\n| The unlink system call traditionally allows the super-user to unlink\n| directories which can damage the filesystem integrity. This\n| implementation no longer permits it.\n\nGreat.\n\n-bcd\n"},{"id":"47556","messageId":"86d4ys71nw.fsf@lola.quinscape.zz","threadId":"9057","inReplyTo":"20070716133602.GB26675@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"David Kastrup","fromEmail":"dak@gnu.org","sentAt":"2007-07-16T16:29:07Z","receivedAt":"2007-07-16T16:29:07Z","isPatch":false,"sender":{"key":"dak@gnu.org","avatar":"https://avatars.githubusercontent.com/u/52141349?v=4"},"body":"Thomas Glanzmann <thomas@glanzmann.de> writes:\n\n> Hello,\n> might that be related to the problem:\n>\n>\n>         lstat64(\"profiles/icpc\", 0xFFBFF350)            Err#2 ENOENT\n> =>       mkdir(\"profiles\", 0777)                         = 0\n>         stat64(\".git/objects/66/6197b02f46c92f0273f16ac77d34d76b28f4f0\",\n>         0xFFBFF088) = 0\n>         open64(\".git/objects/66/6197b02f46c92f0273f16ac77d34d76b28f4f0\",\n>         O_RDONLY) = 4\n>         mmap64(0x00000000, 284, PROT_READ, MAP_PRIVATE, 4, 0) = 0xFF230000\n>         close(4)                                        = 0\n>         munmap(0xFF230000, 284)                         = 0\n>         open64(\"profiles/icpc\", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4\n>         open64(\"profiles/.gitattributes\", O_RDONLY)     Err#2 ENOENT\n>         write(4, \" #   I C P C   P r o f i\".., 420)     = 420\n>         close(4)                                        = 0\n>         lstat64(\"profiles/sithglan\", 0xFFBFF350)        Err#2 ENOENT\n> =>      mkdir(\"profiles\", 0777)                         Err#17 EEXIST\n> =>      unlink(\"profiles\")                              = 0\n> =>      mkdir(\"profiles\", 0777)                         = 0\n>\n> I think it is. Damn it. What seems to hapen here is that git does:\n>\n>         - create a subdirectory\n>         - puts a file in\n>         - deletes a subdirectory (by call unlink - that would normally fail,\n>           but with solaris as root it does not fail)\n>\n>                 => here comes the dangling hard link counter\n>\n>         - created the directory again\n>         - puts the file in\n>\n> That is why I only see one file in each subdirectory (the one that got\n> checkedout last). So the fix for git should be straight forward. But I still\n> think that Solaris is obviously broken. Because if you ask me it should not be\n> possible to unlink a directory that has files in it?!\n\n<URL:http://www.opengroup.org/onlinepubs/000095399/functions/unlink.html>\n\n    The path argument shall not name a directory unless the process has\n    appropriate privileges and the implementation supports using unlink()\n    on directories.\n\nSo Solaris has the right to do this.\n\n    APPLICATION USAGE\n\n        Applications should use rmdir() to remove a directory.\n\n    RATIONALE\n\n        Unlinking a directory is restricted to the superuser in many\n        historical implementations for reasons given in link() (see\n        also rename()).\n\n\nIn short: git should not call remove, ever.  It may succeed, and is a\nbadly low-level call.  If something is known to be a directory, then\nit needs to be removed using rmdir, and if it is a nondirectory, with\nunlink.\n\nHm, browsing through Posix indicates that unlink is probably the same\nas remove.  Pity.  I thought that just \"remove\" was the potential\nevildoer.\n\n-- \nDavid Kastrup\n"},{"id":"47559","messageId":"20070716164042.GB4484@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"20070716131537.GA26675@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T16:40:42Z","receivedAt":"2007-07-16T16:40:42Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\n\n\n> exactly. The question is: Is it a Solaris bug or is it something that is\n> supposed a user is able to do (it doesn't make sense for me)? I posted\n> this problem to comp.unix.solaris and also contacted the UFS Maintainer\n> of Solaris (it is not the first UFS bug I original found). If I don't\n> receive feedback, I am going to open a call with Sun. Whatever is going\n> on (hopefully it isn't PEBKAC - but I don't think so) and this time it\n> isn't broken hardware either (like the last time I reported a serious\n> git bug) because it happens on two machines.\n\nbelow I quote the answer of the UFS maintainer:\n\nThomas,\n\nsome notes on the unlink(directory) part:\n\nIn the case of calling unlink(2) on a directory as a privilidged user, things\nlike \"..\" (and the link count in the parent) would not be cleaned up.\n\nThe man page for unlink(1M) and unlink(2) is very clear about using rmdir(1/2) to\nremove a directory.  It's also very clear that this does exactly what\nit's supposed to do: Remove a link to a file/directory.  Cleaning up\nthe \"..\" entry (which would clean up the link to the parent) could\nbe considered \"extra\".\n\nFirst the standards issues:\n    The link(BA_OS) and unlink(BA_OS) descriptions in SVID3 both specify that\n    a process with appropriate privileges is allowed to operate on a directory.\n    We have claimed to conform to SVID3 since Solaris 2.0 and have not announced\n    that we ever plan to EOL SVID3 conformance.\n\n    UFS does support link(2)/unlink(2) with appropriate privilidges of\n    directories while ZFS does not.\n\n    The change that would provide ``Cleaning up the \"..\" entry ...'' would\n    violate both SVID3 and POSIX and SUS requirements.  (The unlink(path)\n    system call is supposed to remove the directory entry named by path; not\n    the directory entry named by path and an arbitrary number of other\n    directory entries.)\n\nSecond some history:\n    Back before there were mkdir() and rmdir() system calls, applications\n    wanting to create a directory invoked the setuid root mkdir utility\n    which performed a series of mknod() and link() operations to create the\n    directory and create dot and dot-dot entries in the new directory.\n    Similarly, applications wanting to remove a directory invoked the\n    setuid root rmdir uility which performed a series of unlink()\n    operations to destroy the directory if it was empty.\n\n    Not quite so far back in ancient history, there is also the point\n    that before symlinks were available it was common practice to make\n    hard links to directories.  Privileged applications can still do this\n    today (as mandated by SVID) using the link() and unlink() system calls\n    and the link and unlink commands.\n\nUFS and ZFS are actually both correct, the standards wording permits either way kind of:\n\n<snip>\nIf path1 names a directory, link() shall fail unless the process has\nappropriate privileges and the implementation supports using link() on directories.\n\nThe path argument shall not name a directory unless the process has\nappropriate privileges and the implementation supports using unlink() on directories.\n<snip end>\n\nThis seems to implicitely allow an escape route; we can declare that no process\nhas sufficient privileges to link(2)/unlink(2) directories or like ZFS did,\nhave the underlaying implementation not supporting it at all.\n\nThe proper way is for the application to use the rmdir(2) system call,\nit's there since ages!\n\nmy bottom line: GIT should not call unlink on a directory.\n\n        Thomas\n"},{"id":"47560","messageId":"alpine.LFD.0.999.0707161001300.20061@woody.linux-foundation.org","threadId":"9057","inReplyTo":"20070716133602.GB26675@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2007-07-16T17:03:32Z","receivedAt":"2007-07-16T17:03:32Z","isPatch":false,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 16 Jul 2007, Thomas Glanzmann wrote:\n>\n> I think it is. Damn it. What seems to hapen here is that git does:\n> \n>         - create a subdirectory\n>         - puts a file in\n>         - deletes a subdirectory (by call unlink - that would normally fail,\n>           but with solaris as root it does not fail)\n\nSolaris is apparently a buggy piece of crap.\n\nI'd suggest making a bug-report. ENOTEMPTY is not an optional error. Posix \nsays \"Shall fail\".\n\n\t\t\tLinus\n"},{"id":"47561","messageId":"alpine.LFD.0.999.0707161004550.20061@woody.linux-foundation.org","threadId":"9057","inReplyTo":"alpine.LFD.0.999.0707161001300.20061@woody.linux-foundation.org","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2007-07-16T17:07:09Z","receivedAt":"2007-07-16T17:07:09Z","isPatch":false,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 16 Jul 2007, Linus Torvalds wrote:\n>\n> Solaris is apparently a buggy piece of crap.\n> \n> I'd suggest making a bug-report. ENOTEMPTY is not an optional error. Posix \n> says \"Shall fail\".\n\nOh, it was apparetly \"unlink()\" that corrupts filesystems. Which isn't \nagainst Posix, it's just stupid.\n\nThe \"unlink directories\" is so old-fashioned that it's not even funny. The \nwhole reason \"rmdir()\" was created was to *not* have that behaviour in the \nOS. \n\nSo I'll have to correct my statement. Please remove the \"buggy\" from \n\"buggy piece of crap\". The rest stands.\n\n\t\tLinus\n"},{"id":"47562","messageId":"20070716171208.GC6134@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"469B821E.85E5EDA9@eudaptics.com","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it ispossible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T17:12:08Z","receivedAt":"2007-07-16T17:12:08Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello Johannes,\n\n> Try swapping the two inner-most if-blocks.\n\nI did and it works as expected:\n\n        (faui04a) [/var/tmp] git clone ~sithglan/work/repositories/public/easix.git test-8\n        Initialized empty Git repository in /var/tmp/test-8/.git/\n        remote: Generating pack...\n        remote: Done counting 317 objects.\n        remote: Deltifying 317 objects...\n        remote:  100% (317/317remote: ) done\n        Indexing 317 objects...\n        remote: Total 317 (delta 182), reused 278 (delta 157)\n        100% (317/317) done\n        Resolving 182 deltas...\n        100% (182/182) done\n\n        (faui04a) [/var/tmp] cd test-8\n        ./test-8\n        (faui04a) [/var/tmp/test-8] git status\n        # On branch master\n        nothing to commit (working directory clean)\n        (faui04a) [/var/tmp/test-8] cd ..\n        (faui04a) [/var/tmp] rm -rf test-8\n\n... I have a filesystem to check. :-)\n\n        Thomas\n"},{"id":"47564","messageId":"20070716171732.GE6134@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"alpine.LFD.0.999.0707161004550.20061@woody.linux-foundation.org","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T17:17:32Z","receivedAt":"2007-07-16T17:17:32Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello Linus,\n\n> I'd suggest making a bug-report. ENOTEMPTY is not an optional error.\n> Posix says \"Shall fail\".  The \"unlink directories\" is so old-fashioned\n> that it's not even funny. The whole reason \"rmdir()\" was created was\n> to *not* have that behaviour in the OS. \n\nI asked the UFS maintainer to reconsider to fix this.\n\n        Thomas\n"},{"id":"47576","messageId":"20070716180910.GB16878@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"20070716171732.GE6134@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-16T18:09:10Z","receivedAt":"2007-07-16T18:09:10Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\n\n> I asked the UFS maintainer to reconsider to fix this.\n\nthe bug is filed.\n\n        Thomas\n"},{"id":"47582","messageId":"85644knmun.fsf@lola.goethe.zz","threadId":"9057","inReplyTo":"20070716154559.GD19073@lavos.net","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it ispossible to create hardlinks for directories as root under solaris)","fromName":"David Kastrup","fromEmail":"dak@gnu.org","sentAt":"2007-07-16T19:57:04Z","receivedAt":"2007-07-16T19:57:04Z","isPatch":false,"sender":{"key":"dak@gnu.org","avatar":"https://avatars.githubusercontent.com/u/52141349?v=4"},"body":"bdowning@lavos.net (Brian Downing) writes:\n\n> On Mon, Jul 16, 2007 at 04:35:10PM +0200, Johannes Sixt wrote:\n>> It tries to remove a *file* that is in the way and create the directory\n>> in its place. But since your unlink() behaves incorrectly (it is\n>> supposed to *fail* for directories), the logic does not quite work as\n>> expected - it mistakes the directory for a file.\n>\n> http://www.opengroup.org/onlinepubs/007908799/xsh/unlink.html\n>\n> | The path argument must not name a directory unless the process has\n> | appropriate privileges and the implementation supports using unlink() on\n> | directories.\n\nIsn't it funny?  The problem with the git code is that the path\nargument must not name a directory _if_ the process has appropriate\nprivileges and the implementation supports using unlink() on\ndirectories.\n\nFailure is not an option, it is a requirement.\n\n-- \nDavid Kastrup, Kriemhildstr. 15, 44793 Bochum\n"},{"id":"47716","messageId":"20070718085055.GL25037@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"20070716180910.GB16878@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-18T08:50:55Z","receivedAt":"2007-07-18T08:50:55Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\n\n> > I asked the UFS maintainer to reconsider to fix this.\n\n> the bug is filed.\n\nhttp://bugs.opensolaris.org/view_bug.do?bug_id=6581318\n\n\tThomas\n"},{"id":"47743","messageId":"alpine.LFD.0.999.0707180844150.27353@woody.linux-foundation.org","threadId":"9057","inReplyTo":"20070718085055.GL25037@cip.informatik.uni-erlangen.de","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2007-07-18T15:45:29Z","receivedAt":"2007-07-18T15:45:29Z","isPatch":false,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Wed, 18 Jul 2007, Thomas Glanzmann wrote:\n>\n> > the bug is filed.\n> \n> http://bugs.opensolaris.org/view_bug.do?bug_id=6581318\n\nI don't think the recipient \"got it\", since it already has a comment about \n\"just use rmdir\".\n\nCan you please tell them that that isn't the point?\n\n\t\tLinus\n"},{"id":"47759","messageId":"20070718181524.GA3396@cip.informatik.uni-erlangen.de","threadId":"9057","inReplyTo":"alpine.LFD.0.999.0707180844150.27353@woody.linux-foundation.org","subject":"Re: \"git clone\" executed as root on solaris 10 shreds UFS (it is possible to create hardlinks for directories as root under solaris)","fromName":"Thomas Glanzmann","fromEmail":"thomas@glanzmann.de","sentAt":"2007-07-18T18:15:24Z","receivedAt":"2007-07-18T18:15:24Z","isPatch":false,"sender":{"key":"thomas@glanzmann.de","avatar":null},"body":"Hello,\n\n> I don't think the recipient \"got it\", since it already has a comment about \n> \"just use rmdir\".  Can you please tell them that that isn't the point?\n\nI already did. They got the point. I have confidence that they fix it.\nBut there is no ETA. And the fix will not be backported.\n\n\tThomas\n"}]}