From patchwork Wed Apr 19 16:29:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9688005 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 16AF66037F for ; Wed, 19 Apr 2017 16:29:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 08B06283E2 for ; Wed, 19 Apr 2017 16:29:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F18A028418; Wed, 19 Apr 2017 16:29:15 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 61565283E2 for ; Wed, 19 Apr 2017 16:29:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S937980AbdDSQ3P (ORCPT ); Wed, 19 Apr 2017 12:29:15 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:33409 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S937977AbdDSQ3N (ORCPT ); Wed, 19 Apr 2017 12:29:13 -0400 Received: by mail-wr0-f194.google.com with SMTP id l28so3902499wre.0; Wed, 19 Apr 2017 09:29:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iTzIQveRZ9ZlJMnGWC6HmBqmgruS3+LVWKzZs9VT+B0=; b=ibjBWAHt8hoojwPisz59soCLXKj7D+LuL7W8KE05Zoo1aWJtJwyKUeBMtGvvEkY4K7 iUUCa8FpzFa3ry6GvqpHyj1dZJ0ezO3SEOZ5cWJqDTWH1DKlvbHAmUmfqPMX/91byXOx o6O+sZPvc6jxOFnTucfNiU9dm3LbyKFLOwKkxBJu8JeRqAW9UhlTdCZ4iTtI8iMCVmhn /NsO4T0Ab0Q9WxiYKPaLJUFSAmwXbcMpapswHldkBL8ghlM7WkPSKZJRk0yFaSVDMX3r af3fn4Qa/xOgxWtjuCnV57qB1nZ+psAj4Nti/EHBSQTPofB9ncoxLnED7MIhP3ExQ2Jx BPgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=iTzIQveRZ9ZlJMnGWC6HmBqmgruS3+LVWKzZs9VT+B0=; b=WzRS9K5QVA3nfOCr4ypxd1VAWvUnye4zv30yIRVoXSAs6O96q6mfCpc+rU+DuBAmU6 IZviZulPMBXfWVDz6pLy4NtGnXdprRjkrjDKugXbKtCtHtNA0XMPFiRrCYo3p56/QMuJ 53L5uNNqD3d5yHsy9hWNXw1KLa8nUUAqAXOGDceSPf8c7BrJRjY3ccoxXFtHQHkEvMNA oPR7vMlfclM4DOKLxYl5tMGs+7N3Sn14Qcbryya9a40npQosNLfUv/PKheXBJDXotxW9 fxg0CghQ/uqydbMm4qhp2U9b9zVUfRsQxnafnaTTdIkyOqYWoxZrIcjoyRtzibeRFLgO mvXA== X-Gm-Message-State: AN3rC/5DQnWiZER5LAlYLkEOnI+40QOxz3r/nRrNsZIwOXIuLTESibP2 NEUn1snzMcJ3cw== X-Received: by 10.223.131.67 with SMTP id 61mr3717469wrd.57.1492619352181; Wed, 19 Apr 2017 09:29:12 -0700 (PDT) Received: from amir-VirtualBox.ctera.local (bzq-166-168-31-246.red.bezeqint.net. [31.168.166.246]) by smtp.gmail.com with ESMTPSA id l19sm3983981wre.2.2017.04.19.09.29.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Apr 2017 09:29:11 -0700 (PDT) From: Amir Goldstein To: Eryu Guan Cc: Trond Myklebust , Jeff Layton , "J . Bruce Fields" , David Howells , Miklos Szeredi , fstests@vger.kernel.org, linux-unionfs@vger.kernel.org Subject: [PATCH v2 2/4] src/open_by_handle: program to exercise open_by_handle_at() syscall Date: Wed, 19 Apr 2017 19:29:17 +0300 Message-Id: <1492619359-24763-3-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1492619359-24763-1-git-send-email-amir73il@gmail.com> References: <1492619359-24763-1-git-send-email-amir73il@gmail.com> Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This is a clone of src/stale_handle.c test that uses generic open_by_handle_at() syscall instead of the xfs specific ioctl. No test is using this program yet. Signed-off-by: Amir Goldstein --- .gitignore | 1 + aclocal.m4 | 15 ++++++ configure.ac | 1 + include/builddefs.in | 1 + src/Makefile | 4 ++ src/open_by_handle.c | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 165 insertions(+) create mode 100644 src/open_by_handle.c diff --git a/.gitignore b/.gitignore index 0336555..ded4a61 100644 --- a/.gitignore +++ b/.gitignore @@ -80,6 +80,7 @@ /src/multi_open_unlink /src/nametest /src/nsexec +/src/open_by_handle /src/permname /src/preallo_rw_pattern_reader /src/preallo_rw_pattern_writer diff --git a/aclocal.m4 b/aclocal.m4 index f3412e1..829fa10 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -37,6 +37,21 @@ AC_DEFUN([AC_PACKAGE_WANT_FALLOCATE], [ have_fallocate=false; AC_MSG_RESULT(no) ]) AC_SUBST(have_fallocate) ]) + +AC_DEFUN([AC_PACKAGE_WANT_OPEN_BY_HANDLE_AT], + [ AC_MSG_CHECKING([for open_by_handle_at]) + AC_TRY_LINK([ +#define _GNU_SOURCE +#include + ], + [ + struct file_handle fh; + open_by_handle_at(0, &fh, 0); + ], + [ have_open_by_handle_at=true; AC_MSG_RESULT(yes) ], + [ have_open_by_handle_at=false; AC_MSG_RESULT(no) ]) + AC_SUBST(have_open_by_handle_at) + ]) m4_include([m4/multilib.m4]) m4_include([m4/package_acldev.m4]) m4_include([m4/package_aiodev.m4]) diff --git a/configure.ac b/configure.ac index 246f92e..1285bf4 100644 --- a/configure.ac +++ b/configure.ac @@ -75,6 +75,7 @@ in AC_PACKAGE_WANT_DMAPI AC_PACKAGE_WANT_LINUX_FIEMAP_H AC_PACKAGE_WANT_FALLOCATE + AC_PACKAGE_WANT_OPEN_BY_HANDLE_AT AC_PACKAGE_WANT_LINUX_PRCTL_H AC_PACKAGE_WANT_LINUX_FS_H AC_PACKAGE_WANT_SSL diff --git a/include/builddefs.in b/include/builddefs.in index 24f838f..2725037 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -61,6 +61,7 @@ ENABLE_SHARED = @enable_shared@ HAVE_DB = @have_db@ HAVE_AIO = @have_aio@ HAVE_FALLOCATE = @have_fallocate@ +HAVE_OPEN_BY_HANDLE_AT = @have_open_by_handle_at@ HAVE_SSL = @have_ssl@ HAVE_DMAPI = @have_dmapi@ HAVE_ATTR_LIST = @have_attr_list@ diff --git a/src/Makefile b/src/Makefile index 247383c..abfd873 100644 --- a/src/Makefile +++ b/src/Makefile @@ -36,6 +36,10 @@ ifeq ($(HAVE_FIEMAP), true) LINUX_TARGETS += fiemap-tester endif +ifeq ($(HAVE_OPEN_BY_HANDLE_AT), true) +LINUX_TARGETS += open_by_handle +endif + ifeq ($(HAVE_FALLOCATE), true) LCFLAGS += -DHAVE_FALLOCATE endif diff --git a/src/open_by_handle.c b/src/open_by_handle.c new file mode 100644 index 0000000..76510ff --- /dev/null +++ b/src/open_by_handle.c @@ -0,0 +1,143 @@ +/* + * open_by_handle.c - attempt to create a file handle and open it + * with open_by_handle_at() syscall + * + * Copyright (C) 2017 CTERA Networks. All Rights Reserved. + * Author: Amir Goldstein + * + * from: + * stale_handle.c + * + * Copyright (C) 2010 Red Hat, Inc. All Rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NUMFILES 1024 + +struct handle { + struct file_handle fh; + unsigned char fid[MAX_HANDLE_SZ]; +} handle[NUMFILES]; + +int main(int argc, char **argv) +{ + int i; + int fd; + int ret; + int failed = 0; + char fname[PATH_MAX]; + char *test_dir; + int mount_fd, mount_id; + + if (argc != 2) { + fprintf(stderr, "usage: open_by_handle \n"); + return EXIT_FAILURE; + } + + test_dir = argv[1]; + mount_fd = open(test_dir, O_RDONLY|O_DIRECTORY); + if (mount_fd < 0) { + perror("open test_dir"); + return EXIT_FAILURE; + } + + /* + * create a large number of files to force allocation of new inode + * chunks on disk. + */ + for (i=0; i < NUMFILES; i++) { + sprintf(fname, "%s/file%06d", test_dir, i); + fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0644); + if (fd < 0) { + printf("Warning (%s,%d), open(%s) failed.\n", __FILE__, __LINE__, fname); + perror(fname); + return EXIT_FAILURE; + } + close(fd); + } + + /* sync to get the new inodes to hit the disk */ + sync(); + + /* create the handles */ + for (i=0; i < NUMFILES; i++) { + sprintf(fname, "%s/file%06d", test_dir, i); + handle[i].fh.handle_bytes = MAX_HANDLE_SZ; + ret = name_to_handle_at(AT_FDCWD, fname, &handle[i].fh, &mount_id, 0); + if (ret < 0) { + perror("name_to_handle"); + return EXIT_FAILURE; + } + } + + /* unlink the files */ + for (i=0; i < NUMFILES; i++) { + sprintf(fname, "%s/file%06d", test_dir, i); + ret = unlink(fname); + if (ret < 0) { + perror("unlink"); + return EXIT_FAILURE; + } + } + + /* sync to get log forced for unlink transactions to hit the disk */ + sync(); + + /* sync once more FTW */ + sync(); + + /* + * now drop the caches so that unlinked inodes are reclaimed and + * buftarg page cache is emptied so that the inode cluster has to be + * fetched from disk again for the open_by_handle() call. + */ + ret = system("echo 3 > /proc/sys/vm/drop_caches"); + if (ret < 0) { + perror("drop_caches"); + return EXIT_FAILURE; + } + + /* + * now try to open the files by the stored handles. Expecting ENOENT + * for all of them. + */ + for (i=0; i < NUMFILES; i++) { + errno = 0; + fd = open_by_handle_at(mount_fd, &handle[i].fh, O_RDWR); + if (fd < 0 && (errno == ENOENT || errno == ESTALE)) { + continue; + } + if (fd >= 0) { + printf("open_by_handle(%d) opened an unlinked file!\n", i); + close(fd); + } else + printf("open_by_handle(%d) returned %d incorrectly on an unlinked file!\n", i, errno); + failed++; + } + if (failed) + return EXIT_FAILURE; + return EXIT_SUCCESS; +}