Thread (23 messages) 23 messages, 3 authors, 2021-01-27

Re: [PATCH 1/8] quota: Allow to pass mount path to quotactl

From: Christoph Hellwig <hch@infradead.org>
Date: 2021-01-22 17:24:43

On Fri, Jan 22, 2021 at 04:15:29PM +0100, Sascha Hauer wrote:
This patch introduces the Q_PATH flag to the quotactl cmd argument.
When given, the path given in the special argument to quotactl will
be the mount path where the filesystem is mounted, instead of a path
to the block device.
This is necessary for filesystems which do not have a block device as
backing store. Particularly this is done for upcoming UBIFS support.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
I hate overloading quotactl even more.  Why not add a new quotactl_path
syscall instead?
quoted hunk ↗ jump to hunk
+static struct super_block *quotactl_sb(dev_t dev, int cmd)
 {
 	struct super_block *sb;
 	bool excl = false, thawed = false;
 
 	if (quotactl_cmd_onoff(cmd)) {
 		excl = true;
@@ -901,12 +887,50 @@ static struct super_block *quotactl_block(const char __user *special, int cmd)
 		goto retry;
 	}
 	return sb;
+}
+
+/*
+ * look up a superblock on which quota ops will be performed
+ * - use the name of a block device to find the superblock thereon
+ */
+static struct super_block *quotactl_block(const char __user *special, int cmd)
+{
+#ifdef CONFIG_BLOCK
+	struct filename *tmp = getname(special);
+	int error;
+	dev_t dev;
 
+	if (IS_ERR(tmp))
+		return ERR_CAST(tmp);
+	error = lookup_bdev(tmp->name, &dev);
+	putname(tmp);
+	if (error)
+		return ERR_PTR(error);
+
+	return quotactl_sb(dev, cmd);
 #else
 	return ERR_PTR(-ENODEV);
 #endif
Normal kernel style would be to keep the ifdef entirely outside the
function.
+static struct super_block *quotactl_path(const char __user *special, int cmd)
+{
+	struct super_block *sb;
+	struct path path;
+	int error;
+
+	error = user_path_at(AT_FDCWD, special, LOOKUP_FOLLOW | LOOKUP_AUTOMOUNT,
+			   &path);
This adds an overly long line.
+	if (error)
+		return ERR_PTR(error);
+
+	sb = quotactl_sb(path.mnt->mnt_sb->s_dev, cmd);
I think quotactl_sb should take the superblock directly.  This will
need a little refactoring of user_get_super, but will lead to much
better logic.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help