Bug 118170 - [zfs] /bin/pwd fails under .zfs/snapshot
Summary: [zfs] /bin/pwd fails under .zfs/snapshot
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: Unspecified
Hardware: Any Any
: Normal Affects Only Me
Assignee: freebsd-fs (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-11-21 09:10 UTC by KOIE Hidetaka
Modified: 2009-05-29 15:00 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description KOIE Hidetaka 2007-11-21 09:10:02 UTC
/bin/pwd reports "No such file or directory" on any directory under .zfs/snapshot.

    % echo $PWD
    /home/koie/.zfs/snapshot
    % ls
    20071109-first/ 20071118/       20071119/       20071120/       20071121/
    % /bin/pwd
    pwd: .: No such file or directory
    % stat .
    3942394176 2 dr-xr-xr-x 2 root wheel 0 2 "Nov 21 17:52:27 2007" "Nov 15 16:06:35 2007" "Nov 15 1\
6:06:35 2007" "Nov 15 16:06:35 2007" 4096 0 0 .
    %

The following is output of truss(1):
% cd .zfs/snapshot/
% truss /bin/pwd
__sysctl(0x7fffffffe520,0x2,0x7fffffffe53c,0x7fffffffe530,0x0,0x0) = 0 (0x0)
mmap(0x0,560,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 34365132800 (0x800525000)
munmap(0x800525000,560)                          = 0 (0x0)
__sysctl(0x7fffffffe590,0x2,0x80062dde8,0x7fffffffe588,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34365132800 (0x800525000)
issetugid(0x800526015,0x800521669,0x800631730,0x800631700,0x49ac,0x7fffffffe588) = 0 (0x0)
open("/etc/libmap.conf",O_RDONLY,0666)           ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",O_RDONLY,057)    = 3 (0x3)
read(3,"Ehnt\^A\0\0\0\M^@\0\0\0m\0\0\0\0"...,128) = 128 (0x80)
lseek(3,0x80,SEEK_SET)                           = 128 (0x80)
read(3,"/lib:/usr/lib:/usr/lib/compat:/u"...,109) = 109 (0x6d)
close(3)                                         = 0 (0x0)
access("/lib/libc.so.7",0)                       = 0 (0x0)
open("/lib/libc.so.7",O_RDONLY,030556300)        = 3 (0x3)
fstat(3,{mode=-r--r--r-- ,inode=16548,size=1159360,blksize=4096}) = 0 (0x0)
read(3,"\^?ELF\^B\^A\^A\t\0\0\0\0\0\0\0"...,4096) = 4096 (0x1000)
mmap(0x0,2224128,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_NOCORE,3,0x0) = 34366234624 (0x800632000)
mprotect(0x80071d000,4096,PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x80071d000,4096,PROT_READ|PROT_EXEC)   = 0 (0x0)
mmap(0x80081d000,118784,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0xeb000) = 34368245760 (0x80081d000)
mmap(0x80083a000,94208,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 34368364544 (0x80083a000)
close(3)                                         = 0 (0x0)
sysarch(0x81,0x7fffffffe610,0x80052a088,0x0,0xffffffffffd02c90,0x7fffffffe368) = 0 (0x0)
mmap(0x0,288,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 34365165568 (0x80052d000)
munmap(0x80052d000,288)                          = 0 (0x0)
mmap(0x0,41776,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 34365165568 (0x80052d000)
munmap(0x80052d000,41776)                        = 0 (0x0)
__sysctl(0x7fffffffe5c0,0x2,0x80083b360,0x7fffffffe5b8,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
__sysctl(0x7fffffffe620,0x2,0x80083f3c8,0x7fffffffe638,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffe180,0x2,0x80084dff8,0x7fffffffe178,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffe1c0,0x2,0x7fffffffe1dc,0x7fffffffe1d0,0x0,0x0) = 0 (0x0)
readlink("/etc/malloc.conf",0x7fffffffe210,1024) ERR#2 'No such file or directory'
issetugid(0x8007151b5,0x7fffffffe210,0x0,0x2,0xffffff004a09a000,0x7fffffffe1f8) = 0 (0x0)
__sysctl(0x7fffffffe110,0x2,0x7fffffffe12c,0x7fffffffe120,0x0,0x0) = 0 (0x0)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34365165568 (0x80052d000)
mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34368458752 (0x800851000)
munmap(0x800851000,716800)                       = 0 (0x0)
munmap(0x800a00000,331776)                       = 0 (0x0)
__getcwd(0x800901400,1024)                       ERR#20 'Not a directory'
stat("/",{mode=drwxr-xr-x ,inode=2,size=512,blksize=4096}) = 0 (0x0)
lstat(".",{mode=dr-xr-xr-x ,inode=2,size=2,blksize=4096}) = 0 (0x0)
stat("..",{mode=dr-xr-xr-x ,inode=1,size=3,blksize=4096}) = 0 (0x0)
open("..",O_NONBLOCK,035277024500)               = 3 (0x3)
fstat(3,{mode=dr-xr-xr-x ,inode=1,size=3,blksize=4096}) = 0 (0x0)
fcntl(3,F_SETFD,FD_CLOEXEC)                      = 0 (0x0)
fstatfs(0x3,0x7fffffffe420,0x0,0x0,0x60,0x7fffffffe3d8) = 0 (0x0)
fstat(3,{mode=dr-xr-xr-x ,inode=1,size=3,blksize=4096}) = 0 (0x0)
koie@guriandgura% truss /bin/pwd
__sysctl(0x7fffffffe520,0x2,0x7fffffffe53c,0x7fffffffe530,0x0,0x0) = 0 (0x0)
mmap(0x0,560,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 34365132800 (0x800525000)
munmap(0x800525000,560)                          = 0 (0x0)
__sysctl(0x7fffffffe590,0x2,0x80062dde8,0x7fffffffe588,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34365132800 (0x800525000)
issetugid(0x800526015,0x800521669,0x800631730,0x800631700,0x49ac,0x7fffffffe588) = 0 (0x0)
open("/etc/libmap.conf",O_RDONLY,0666)           ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",O_RDONLY,057)    = 3 (0x3)
read(3,"Ehnt\^A\0\0\0\M^@\0\0\0m\0\0\0\0"...,128) = 128 (0x80)
lseek(3,0x80,SEEK_SET)                           = 128 (0x80)
read(3,"/lib:/usr/lib:/usr/lib/compat:/u"...,109) = 109 (0x6d)
close(3)                                         = 0 (0x0)
access("/lib/libc.so.7",0)                       = 0 (0x0)
open("/lib/libc.so.7",O_RDONLY,030556300)        = 3 (0x3)
fstat(3,{mode=-r--r--r-- ,inode=16548,size=1159360,blksize=4096}) = 0 (0x0)
read(3,"\^?ELF\^B\^A\^A\t\0\0\0\0\0\0\0"...,4096) = 4096 (0x1000)
mmap(0x0,2224128,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_NOCORE,3,0x0) = 34366234624 (0x800632000)
mprotect(0x80071d000,4096,PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x80071d000,4096,PROT_READ|PROT_EXEC)   = 0 (0x0)
mmap(0x80081d000,118784,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0xeb000) = 34368245760 (0x80081d000)
mmap(0x80083a000,94208,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 34368364544 (0x80083a000)
close(3)                                         = 0 (0x0)
sysarch(0x81,0x7fffffffe610,0x80052a088,0x0,0xffffffffffd02c90,0x7fffffffe368) = 0 (0x0)
mmap(0x0,288,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 34365165568 (0x80052d000)
munmap(0x80052d000,288)                          = 0 (0x0)
mmap(0x0,41776,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 34365165568 (0x80052d000)
munmap(0x80052d000,41776)                        = 0 (0x0)
__sysctl(0x7fffffffe5c0,0x2,0x80083b360,0x7fffffffe5b8,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
__sysctl(0x7fffffffe620,0x2,0x80083f3c8,0x7fffffffe638,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffe180,0x2,0x80084dff8,0x7fffffffe178,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffe1c0,0x2,0x7fffffffe1dc,0x7fffffffe1d0,0x0,0x0) = 0 (0x0)
readlink("/etc/malloc.conf",0x7fffffffe210,1024) ERR#2 'No such file or directory'
issetugid(0x8007151b5,0x7fffffffe210,0x0,0x2,0xffffff003bc7e000,0x7fffffffe1f8) = 0 (0x0)
__sysctl(0x7fffffffe110,0x2,0x7fffffffe12c,0x7fffffffe120,0x0,0x0) = 0 (0x0)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34365165568 (0x80052d000)
mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34368458752 (0x800851000)
munmap(0x800851000,716800)                       = 0 (0x0)
munmap(0x800a00000,331776)                       = 0 (0x0)
__getcwd(0x800901400,1024)                       ERR#20 'Not a directory'
stat("/",{mode=drwxr-xr-x ,inode=2,size=512,blksize=4096}) = 0 (0x0)
lstat(".",{mode=dr-xr-xr-x ,inode=2,size=2,blksize=4096}) = 0 (0x0)
stat("..",{mode=dr-xr-xr-x ,inode=1,size=3,blksize=4096}) = 0 (0x0)
open("..",O_NONBLOCK,035277024500)               = 3 (0x3)
fstat(3,{mode=dr-xr-xr-x ,inode=1,size=3,blksize=4096}) = 0 (0x0)
fcntl(3,F_SETFD,FD_CLOEXEC)                      = 0 (0x0)
fstatfs(0x3,0x7fffffffe420,0x0,0x0,0x60,0x7fffffffe3d8) = 0 (0x0)
fstat(3,{mode=dr-xr-xr-x ,inode=1,size=3,blksize=4096}) = 0 (0x0)
getdirentries(0x3,0x80090b000,0x1000,0x8009090a8,0xffffff003bc7e000,0x7fffffffe6b8) = 44 (0x2c)
lseek(3,0x0,SEEK_SET)                            = 0 (0x0)
close(3)                                         = 0 (0x0)
lstat("../",{mode=dr-xr-xr-x ,inode=1,size=3,blksize=4096}) = 0 (0x0)
stat("../..",{mode=drwxr-xr-x ,inode=3,size=89,blksize=4096}) = 0 (0x0)
open("../..",O_NONBLOCK,035277024500)            = 3 (0x3)
fstat(3,{mode=drwxr-xr-x ,inode=3,size=89,blksize=4096}) = 0 (0x0)
fcntl(3,F_SETFD,FD_CLOEXEC)                      = 0 (0x0)
fstatfs(0x3,0x7fffffffe420,0x0,0x0,0x60,0x7fffffffe3d8) = 0 (0x0)
fstat(3,{mode=drwxr-xr-x ,inode=3,size=89,blksize=4096}) = 0 (0x0)
getdirentries(0x3,0x80090b000,0x1000,0x8009090a8,0xffffff003bc7e000,0x7fffffffe6b8) = 1772 (0x6ec)
getdirentries(0x3,0x80090b000,0x1000,0x8009090a8,0xffffff003bc7e000,0x7fffffffe698) = 0 (0x0)
lseek(3,0x0,SEEK_SET)                            = 0 (0x0)
close(3)                                         = 0 (0x0)
pwd: write(2,"pwd: ",5)                          = 5 (0x5)
.write(2,".",1)                                  = 1 (0x1)
: write(2,": ",2)                                        = 2 (0x2)
No such file or directory
write(2,"No such file or directory\n",26)        = 26 (0x1a)
process exit, rval = 1
%

How-To-Repeat: cd .zfs/snapshot
/bin/pwd
Comment 1 Remko Lodder freebsd_committer freebsd_triage 2007-11-21 09:15:26 UTC
Responsible Changed
From-To: freebsd-bugs->pjd

Over to ZFS maintainer
Comment 2 K. Macy freebsd_committer freebsd_triage 2009-05-17 06:04:10 UTC
State Changed
From-To: open->patched



not present in recent sources 

kmacy@delirium [/usr/.zfs/snapshot/foo|22:04|39] pwd 
/usr/.zfs/snapshot/foo
Comment 3 Mark Linimon freebsd_committer freebsd_triage 2009-05-28 23:20:57 UTC
Responsible Changed
From-To: pjd->freebsd-fs

With pjd's permission, reassing ZFS-related PRs to freebsd-fs.
Comment 4 K. Macy freebsd_committer freebsd_triage 2009-05-29 00:09:37 UTC
State Changed
From-To: patched->closed



no longer applies 

kmacy@delirium [~|16:08|103] zfs list -t snapshot 
NAME      USED  AVAIL  REFER  MOUNTPOINT 
usr@foo   493M      -  14.9G  - 
kmacy@delirium [~|16:08|104] zfs list             
NAME      USED  AVAIL  REFER  MOUNTPOINT 
usr      27.4G  70.5G  16.5G  /usr 
usr/tmp  10.4G  70.5G  10.4G  /usr/tmp 
kmacy@delirium [~|16:08|105] cd /usr/.zfs/snapshot 
kmacy@delirium [/usr/.zfs/snapshot|16:09|106] pwd 
/usr/.zfs/snapshot 
kmacy@delirium [/usr/.zfs/snapshot|16:09|107] ls 
foo 
kmacy@delirium [/usr/.zfs/snapshot|16:09|108] ls foo  
X11R6           crash           include         libexec         ports           tmp 
bar             foo             lib             local           sbin            trash 
bin             games           lib32           local.tgz       share 
compat          home            libdata         obj             src 
kmacy@delirium [/usr/.zfs/snapshot|16:09|109] cd foo  
kmacy@delirium [/usr/.zfs/snapshot/foo|16:09|110] pwd 
/usr/.zfs/snapshot/foo 
kmacy@delirium [/usr/.zfs/snapshot/foo|16:09|111]
Comment 5 Jaakko Heinonen 2009-05-29 14:58:50 UTC
Hi,

On 2009-05-28, kmacy@FreeBSD.org wrote:
> no longer applies
> 
> kmacy@delirium [/usr/.zfs/snapshot|16:09|109] cd foo 
> kmacy@delirium [/usr/.zfs/snapshot/foo|16:09|110] pwd
> /usr/.zfs/snapshot/foo

The problem still exists. It seems that you used shell built-in pwd
which doesn't call getcwd(3) but uses it's own bookkeeping for working
directory.

The problem was discussed on -fs in February and I described it in this
message:

http://lists.freebsd.org/pipermail/freebsd-fs/2009-February/005671.html

Since then __getcwd() has improved because vop_stdvptocnp() can now use
readdir("..") to resolve component names. However it can't cross mount
points and because zfs snapshot are mounted the problem is still there.

-- 
Jaakko