Thanks for your comments, Miao. On Thu, Jan 31, 2013 at 4:42 AM, Miao Xie <miaox@xxxxxxxxxxxxxx> wrote: > On Wed, 30 Jan 2013 20:23:22 +0200, Alex Lyakas wrote: >> Hi Miao, >> I was following this thread in the past, but I did not understand it >> fully, maybe you can explain? >> >>>>>> # mkfs.btrfs <partition> >>>>>> # mount <partition> <mnt> >>>>>> # cd <mnt> >>>>>> # for ((i=0;i<2400;i++)); do touch long_name_to_make_tree_more_deep$i; done >>>>>> # for ((i=0; i<4; i++)) >>>>>> > do >>>>>> > mkdir $i >>>>>> > for ((j=0; j<200; j++)) >>>>>> > do >>>>>> > btrfs sub snap . $i/$j >>>>>> > done & >>>>>> > done >>>>> >>>>> snapshot creation has a critical section. Once we copy a given root to >>>>> its snapshot, we're not allowed to change it until the transaction >>>>> is fully committed. >> >> Is the limitation that if we are creating a snap B of root A, and >> placing the root of B somewhere into the tree of A, then we can do >> this only once per transaction? Does this limitation still exist or >> your fix fixes it? > > The limitation is the snapshoted subvolume can not be changed until the transaction > is committed. That is we can not insert anything(including the root of B and the > directory item/index of B) into the tree of A after snap B is created. > > This limitation was fixed. > >> Also, according to your reproducer, each "btrfs sub snap" will >> start/join a transaction, but then it will call >> btrfs_commit_transaction() and not btrfs_commit_transaction_async(), >> so it will wait until the transaction commits. So how it may happen >> that you create more than one snap in the same transaction with your >> reproducer? > > run several tasks, and each task create snapshots repeatedly in its own > directory. > (If we create snapshots in the same directory, the i_mutex of the directory > will make the process serialized) So I missed the fact that btrfs_start_transaction() can actually join an existing transaction. So if several threads ask to create snaps in parallel, we may hit this. > >> The reason I am asking, is that I want to try to write code that >> creates several snaps in one transaction and only then commits. Should >> this be possible or there is some limitation, like I mentioned above? > > As far as I know, it is possible, there is no limitation now. > > Thanks > Miao -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
