All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
To: Chris Mason <chris.mason@oracle.com>
Cc: Linux Btrfs <linux-btrfs@vger.kernel.org>
Subject: [BUG?] There is a possibility that 'i_ino' overflows
Date: Thu, 16 Dec 2010 17:44:03 +0900	[thread overview]
Message-ID: <4D09D153.1060208@jp.fujitsu.com> (raw)

Hi,

In btrfs, inode number is increased each time a new file or directory
is made.
Therefore, if the making deletion of the file is repeated, value of
'i_ino' increases rapidly.

For example, inode number changes as follows. 

  $ touch foo
  $ ls -i foo
  266 foo
  $ rm foo
  $ touch bar
  $ ls -i bar
  267 bar
  $

And then, length of 'i_ino' and 'objectid' is as follows on the x86
system. 

  unsigned long i_ino == 32bits
  u64 objectid        == 64bits

Therefore, in the operation to substitute 'objectid' to 'i_ino',
'i_ino' overflows when 'objectid' 4294967296 is substituted to 'i_ino'. 
Then, the file with inode number 0 is made.

As a result, ls command has looped infinitely, and btrfsck detected the
error.
Please see below.

  $ uname -a
  Linux luna 2.6.37-rc5 #1 SMP Thu Dec 9 13:02:41 JST 2010 i686 i686 i386 GNU/Linux
  $ df -T /test1
  Filesystem    Type   1K-blocks      Used Available Use% Mounted on
  /dev/sdd14   btrfs     4162560        56   3717632   1% /test1
  $ strace -FfTttx ls /test1
  14:03:10.115440 execve("/bin/ls", ["ls", "/test1"], [/* 28 vars */]) = 0 <0.000181>
  ...
  ...
  14:03:10.123431 stat("/test1", {st_mode=S_IFDIR|0777, st_size=8, ...}) = 0 <0.000017>
  14:03:10.123521 open("/test1", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 <0.000018>
  14:03:10.123578 fcntl(3, F_GETFD)       = 0x1 (flags FD_CLOEXEC) <0.000013>
  14:03:10.123637 getdents(3, /* 3 entries */, 32768) = 72 <0.000025>
  14:03:10.123712 getdents(3, /* 1 entries */, 32768) = 24 <0.000016>
  14:03:10.123768 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.123824 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.123880 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.123936 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.123992 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.124047 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.124103 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.124261 getdents(3, /* 1 entries */, 32768) = 24 <0.000016>
  14:03:10.124320 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.124381 getdents(3, /* 1 entries */, 32768) = 24 <0.000015>
  14:03:10.124437 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124493 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124549 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124605 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124661 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124717 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124773 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124840 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  14:03:10.124896 getdents(3, /* 1 entries */, 32768) = 24 <0.000014>
  ...
  ...
  $ cd /test1
  $ ls -i A123
  ls: cannot access A123: No such file or directory
  $ touch aaaa
  $ ls -i aaaa
  1 aaaa
  $

  # umount /test1
  # btrfsck /dev/sdd14
  root 5 inode 0 errors 2001
          unresolved ref dir 256 index 4294967041 namelen 4 name A123 filetype 1 error 4
  root 5 inode 1 errors 2001
          unresolved ref dir 256 index 4294967042 namelen 4 name aaaa filetype 1 error 4
  root 5 inode 4294967296 errors 2000
          unresolved ref dir 256 index 4294967041 namelen 4 name A123 filetype 0 error 3
  root 5 inode 4294967297 errors 2000
          unresolved ref dir 256 index 4294967042 namelen 4 name aaaa filetype 0 error 3
  found 28672 bytes used err is 1
  total csum bytes: 0
  total tree bytes: 28672
  total fs tree bytes: 8192
  btree space waste bytes: 23191
  file data blocks allocated: 0
   referenced 0
  Btrfs v0.19-36-g70c6c10
  #


Regards,
Itoh


             reply	other threads:[~2010-12-16  8:45 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-16  8:44 Tsutomu Itoh [this message]
2010-12-20  2:02 ` [BUG?] There is a possibility that 'i_ino' overflows Tsutomu Itoh
2010-12-21 21:52   ` Chris Mason

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=4D09D153.1060208@jp.fujitsu.com \
    --to=t-itoh@jp.fujitsu.com \
    --cc=chris.mason@oracle.com \
    --cc=linux-btrfs@vger.kernel.org \
    /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.