Setting project quotas on special files
Tiziano Müller
tiziano.mueller at stepping-stone.ch
Sun Nov 10 09:06:17 CST 2013
Hi Jeff
Sorry for top-posting, but it may be better to illustrate this with an
isolated example:
I have a volume named "backup" mounted with option "pquota", then I do
the following inside that mountpoint:
localhost backup # mkdir test
localhost backup # ln -s /invalid/location test/symlinkA
localhost backup # echo 42:/var/backup/test >> /etc/projects
localhost backup # echo test:42 >> /etc/projid
localhost backup # xfs_quota -x -c 'project -s test' /var/backup
Setting up project test (path /var/backup/test)...
xfs_quota: skipping special file /var/backup/test/symlinkA
Processed 1 (/etc/projects and cmdline) paths for project test with recursion depth infinite (-1).
localhost backup # cp -al test/symlinkA test/symlinkB
cp: cannot create hard link "test/symlinkB" to "test/symlinkA": Invalid cross-device link
localhost backup #
Creating a symlink after setting up project quotas in the same directory
yields a different behaviour:
localhost backup # ln -s /invalid/location test/symlinkC
localhost backup # cp -al test/symlinkC test/symlinkD
localhost backup #
The following shows that a symlink alone (and not its target) can have a
project id assigned and that the project id must be assigned to be able
to create a hardlink of a symlink (no matter where it points to).
For each of the symlinks test/symlink{A,B} run `stat` to get the inode
then use xfs_db on that inode to get the attributes:
localhost backup # xfs_db -r -c 'inode 4362' -c 'p' /dev/vdb1 | grep projid
core.projid_lo = 0
core.projid_hi = 0
localhost backup # xfs_db -r -c 'inode 4363' -c 'p' /dev/vdb1 | grep projid
core.projid_lo = 42
core.projid_hi = 0
Unfortunately xfs_io tries to follow the symlinks so it can not be used
to set the project manually.
What works though is renaming the file:
localhost backup # mv test/symlinkA test/symlinkAtmp
localhost backup # mv test/symlinkAtmp test/symlinkA
localhost backup # stat test/symlinkA
File: ‘test/symlinkA’ -> ‘/invalid/location’
Size: 17 Blocks: 0 IO Block: 4096 symbolic link
Device: fe11h/65041d Inode: 4364 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-10 15:49:44.870068178 +0100
Modify: 2013-11-10 15:49:44.870068178 +0100
Change: 2013-11-10 16:00:54.957571504 +0100
Birth: -
localhost backup # xfs_db -r -c 'inode 4364' -c 'p' /dev/vdb1 | grep
projid
core.projid_lo = 42
core.projid_hi = 0
localhost backup # cp -al test/symlinkA test/symlinkB
localhost backup #
Best regards,
Tiziano
Am Sonntag, den 10.11.2013, 02:46 -0800 schrieb Jeff Liu:
> On 11/10 2013 15:39 PM, Tiziano Müller wrote:
> > Hi everyone
> >
> > It started with the following error:
> >
> > dev # cp -al dvd dvd2
> > cp: cannot create hard link ‘dvd2’ to ‘dvd’: Invalid cross-device link
> >
> > "dvd" is in this case a symlink (but I also did the test with special
> > devices).
> This definitely would fail if you trying to create hard links across
> volumes.
> >
> > What I did was: copy that symlink from somewhere else, trying to turn on
> > project quotas on a parent directoy of that "dev" directory which gives
> > me:
> >
> > xfs_quota: skipping special file /var/foo/dev/dvd
> symlink files will be skipped and xfs_quota consider it as special file
> just like fifo, sock, etc...
>
> If xfs_quota do check with follow symlinks, then the project id is potentially
> applied to files on another filesystem.
>
> >
> > When I examine the inode using xfs_db I get for my "dvd" symlink:
> >
> > core.projid_lo = 0
> > core.projid_hi = 0
> >
> > When I create a new symlink "foo" (with the same uid+gid as "dvd") and
> > examine it's inode using xfs_db:
> >
> > core.projid_lo = 2398
> > core.projid_hi = 61
> >
> > What I therefore seem to encounter is the problem mentioned in xfs_quota
> > for the project subcommand:
> >
> > An attempt to create a hard link to a file in the tree will only succeed if the project identi‐
> > fier matches the project identifier for the tree.
> >
> > I could now use xfs_io to fix all special files once (since newly
> > created ones will carry the project id directly), but why does
> > "xfs_quota -x -c 'project -s test1' /var" skip special files if it is
> > clearly possible and required to set the project id on them to have
> > hardlinks working again within the project dir?
> Sorry if I misunderstood your question, but the existing hard link files
> would
> notbe skipped IMO. For the project subcommand, it means we could not create
> hardlinks cross different project trees.
>
> Thanks,
> -Jeff
>
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
--
stepping stone GmbH
Neufeldstrasse 9
CH-3012 Bern
Telefon: +41 31 332 53 63
www.stepping-stone.ch
tiziano.mueller at stepping-stone.ch
More information about the xfs
mailing list