Skip to content
Permalink
Browse files
quota: Add mountpath based quota support
Add syscall quotactl_path, a variant of quotactl which allows to specify
the mountpath instead of a path of to a block device.

The quotactl syscall expects a path to the mounted block device to
specify the filesystem to work on. This limits usage to filesystems
which actually have a block device. quotactl_path replaces the path
to the block device with a path where the filesystem is mounted at.

The global Q_SYNC command to sync all filesystems is not supported for
this new syscall, otherwise quotactl_path behaves like quotactl.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
  • Loading branch information
saschahauer authored and intel-lab-lkp committed Feb 11, 2021
1 parent 9a4ea3c commit 4b7a3df11dd2ca215a6e9b24d81c98d6951476b6
Showing 1 changed file with 49 additions and 0 deletions.
@@ -17,6 +17,7 @@
#include <linux/capability.h>
#include <linux/quotaops.h>
#include <linux/types.h>
#include <linux/mount.h>
#include <linux/writeback.h>
#include <linux/nospec.h>
#include "compat.h"
@@ -968,3 +969,51 @@ SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special,
path_put(pathp);
return ret;
}

SYSCALL_DEFINE4(quotactl_path, unsigned int, cmd, const char __user *,
mountpoint, qid_t, id, void __user *, addr)
{
struct super_block *sb;
struct path mountpath;
unsigned int cmds = cmd >> SUBCMDSHIFT;
unsigned int type = cmd & SUBCMDMASK;
int ret;

if (type >= MAXQUOTAS)
return -EINVAL;

if (!mountpoint)
return -ENODEV;

ret = user_path_at(AT_FDCWD, mountpoint,
LOOKUP_FOLLOW | LOOKUP_AUTOMOUNT, &mountpath);
if (ret)
return ret;

sb = mountpath.dentry->d_inode->i_sb;

if (quotactl_cmd_write(cmds)) {
ret = mnt_want_write(mountpath.mnt);
if (ret)
goto out;
}

if (quotactl_cmd_onoff(cmds))
down_write(&sb->s_umount);
else
down_read(&sb->s_umount);

ret = do_quotactl(sb, type, cmds, id, addr, ERR_PTR(-EINVAL));

if (quotactl_cmd_onoff(cmds))
up_write(&sb->s_umount);
else
up_read(&sb->s_umount);

if (quotactl_cmd_write(cmds))
mnt_drop_write(mountpath.mnt);
out:
path_put(&mountpath);

return ret;
}

0 comments on commit 4b7a3df

Please sign in to comment.