On Wed, Oct 31, 2012 at 11:34 AM, Anand Jain <anand.j...@oracle.com> wrote:
>
> Stefan,
>
>  This is useful. Do you have something which can apply on the latest.

The patch below has one problem. The functions open_file_or_dir() in btrfsctl.c
and in common.c are differents. The former has few perror() which are missing
in the latter.

I am working in a change which moves both the open_file_or_dir() and the
scrub_fs_info() / scrub_device_info() pairs in utils.c. It was necessary
because I used both in a my application. I hope to issue the patch for
the end of the next week.

In order to address the issue of the perror, I renamed in btrfsctl.c the
function open_file_or_dir() in btrfsctl_open_file_or_dir() in order to avoid
name collision.

G.Baroncelli

-- 
gpg @keyserver.linux.it: Goffredo Baroncelli (kreijackATinwind.it>
Key fingerprint BBF5 1610 0B64 DAC6 5F7D  17B2 0EDA 9B37 8B82 E0B5
>
> Thanks, Anand
>
> On 25/05/12 22:07, Stefan Behrens wrote:
>>
>> This is a preparation step to add support for device stats. The definition
>> of the function open_file_or_dir() is moved from common.c to utils.c in
>> order to be able to share some common code between scrub and the device
>> stats in the following step. That common code uses open_file_or_dir().
>> Since open_file_or_dir() makes use of the function dirfd(3), the required
>> XOPEN version was raised from 6 to 7.
>>
>> Signed-off-by: Stefan Behrens <sbehr...@giantdisaster.de>
>> ---
>>   Makefile         |    4 ++--
>>   btrfsctl.c       |   28 ----------------------------
>>   cmds-balance.c   |    1 +
>>   cmds-inspect.c   |    1 +
>>   cmds-subvolume.c |    1 +
>>   commands.h       |    3 ---
>>   common.c         |   46 ----------------------------------------------
>>   utils.c          |   31 +++++++++++++++++++++++++++++--
>>   utils.h          |    3 +++
>>   9 files changed, 37 insertions(+), 81 deletions(-)
>>
>> diff --git a/Makefile b/Makefile
>> index 79818e6..fe2b432 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -39,8 +39,8 @@ all: version $(progs) manpages
>>   version:
>>         bash version.sh
>>
>> -btrfs: $(objects) btrfs.o help.o common.o $(cmds_objects)
>> -       $(CC) $(CFLAGS) -o btrfs btrfs.o help.o common.o $(cmds_objects) \
>> +btrfs: $(objects) btrfs.o help.o $(cmds_objects)
>> +       $(CC) $(CFLAGS) -o btrfs btrfs.o help.o $(cmds_objects) \
>>                 $(objects) $(LDFLAGS) $(LIBS) -lpthread
>>
>>   calc-size: $(objects) calc-size.o
>> diff --git a/btrfsctl.c b/btrfsctl.c
>> index d45e2a7..f0584f3 100644
>> --- a/btrfsctl.c
>> +++ b/btrfsctl.c
>> @@ -63,34 +63,6 @@ static void print_usage(void)
>>         exit(1);
>>   }
>>
>> -static int open_file_or_dir(const char *fname)
>> -{
>> -       int ret;
>> -       struct stat st;
>> -       DIR *dirstream;
>> -       int fd;
>> -
>> -       ret = stat(fname, &st);
>> -       if (ret < 0) {
>> -               perror("stat:");
>> -               exit(1);
>> -       }
>> -       if (S_ISDIR(st.st_mode)) {
>> -               dirstream = opendir(fname);
>> -               if (!dirstream) {
>> -                       perror("opendir");
>> -                       exit(1);
>> -               }
>> -               fd = dirfd(dirstream);
>> -       } else {
>> -               fd = open(fname, O_RDWR);
>> -       }
>> -       if (fd < 0) {
>> -               perror("open");
>> -               exit(1);
>> -       }
>> -       return fd;
>> -}
>>   int main(int ac, char **av)
>>   {
>>         char *fname = NULL;
>> diff --git a/cmds-balance.c b/cmds-balance.c
>> index 38a7426..5793b5c 100644
>> --- a/cmds-balance.c
>> +++ b/cmds-balance.c
>> @@ -26,6 +26,7 @@
>>   #include "ctree.h"
>>   #include "ioctl.h"
>>   #include "volumes.h"
>> +#include "utils.h"
>>
>>   #include "commands.h"
>>
>> diff --git a/cmds-inspect.c b/cmds-inspect.c
>> index 2f0228f..7a8785b 100644
>> --- a/cmds-inspect.c
>> +++ b/cmds-inspect.c
>> @@ -22,6 +22,7 @@
>>
>>   #include "kerncompat.h"
>>   #include "ioctl.h"
>> +#include "utils.h"
>>
>>   #include "commands.h"
>>
>> diff --git a/cmds-subvolume.c b/cmds-subvolume.c
>> index 950fa8f..8ecd3f4 100644
>> --- a/cmds-subvolume.c
>> +++ b/cmds-subvolume.c
>> @@ -26,6 +26,7 @@
>>
>>   #include "kerncompat.h"
>>   #include "ioctl.h"
>> +#include "utils.h"
>>
>>   #include "commands.h"
>>
>> diff --git a/commands.h b/commands.h
>> index a303a50..aea4cb1 100644
>> --- a/commands.h
>> +++ b/commands.h
>> @@ -79,9 +79,6 @@ void help_ambiguous_token(const char *arg, const struct
>> cmd_group *grp);
>>
>>   void help_command_group(const struct cmd_group *grp, int argc, char
>> **argv);
>>
>> -/* common.c */
>> -int open_file_or_dir(const char *fname);
>> -
>>   extern const struct cmd_group subvolume_cmd_group;
>>   extern const struct cmd_group filesystem_cmd_group;
>>   extern const struct cmd_group balance_cmd_group;
>> diff --git a/common.c b/common.c
>> deleted file mode 100644
>> index 03f6570..0000000
>> --- a/common.c
>> +++ /dev/null
>> @@ -1,46 +0,0 @@
>> -/*
>> - * This program is free software; you can redistribute it and/or
>> - * modify it under the terms of the GNU General Public
>> - * License v2 as published by the Free Software Foundation.
>> - *
>> - * 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 021110-1307, USA.
>> - */
>> -
>> -#include <sys/types.h>
>> -#include <sys/stat.h>
>> -#include <dirent.h>
>> -#include <fcntl.h>
>> -
>> -int open_file_or_dir(const char *fname)
>> -{
>> -       int ret;
>> -       struct stat st;
>> -       DIR *dirstream;
>> -       int fd;
>> -
>> -       ret = stat(fname, &st);
>> -       if (ret < 0) {
>> -               return -1;
>> -       }
>> -       if (S_ISDIR(st.st_mode)) {
>> -               dirstream = opendir(fname);
>> -               if (!dirstream) {
>> -                       return -2;
>> -               }
>> -               fd = dirfd(dirstream);
>> -       } else {
>> -               fd = open(fname, O_RDWR);
>> -       }
>> -       if (fd < 0) {
>> -               return -3;
>> -       }
>> -       return fd;
>> -}
>> diff --git a/utils.c b/utils.c
>> index ee7fa1b..6157115 100644
>> --- a/utils.c
>> +++ b/utils.c
>> @@ -16,8 +16,9 @@
>>    * Boston, MA 021110-1307, USA.
>>    */
>>
>> -#define _XOPEN_SOURCE 600
>> -#define __USE_XOPEN2K
>> +#define _XOPEN_SOURCE 700
>> +#define __USE_XOPEN2K8
>> +#define __XOPEN2K8 /* due to an error in dirent.h, to get dirfd() */
>>   #include <stdio.h>
>>   #include <stdlib.h>
>>   #ifndef __CHECKER__
>> @@ -1206,3 +1207,29 @@ scan_again:
>>         return 0;
>>   }
>>
>> +int open_file_or_dir(const char *fname)
>> +{
>> +       int ret;
>> +       struct stat st;
>> +       DIR *dirstream;
>> +       int fd;
>> +
>> +       ret = stat(fname, &st);
>> +       if (ret < 0) {
>> +               return -1;
>> +       }
>> +       if (S_ISDIR(st.st_mode)) {
>> +               dirstream = opendir(fname);
>> +               if (!dirstream) {
>> +                       return -2;
>> +               }
>> +               fd = dirfd(dirstream);
>> +       } else {
>> +               fd = open(fname, O_RDWR);
>> +       }
>> +       if (fd < 0) {
>> +               return -3;
>> +       }
>> +       return fd;
>> +}
>> +
>> diff --git a/utils.h b/utils.h
>> index c5f55e1..e281002 100644
>> --- a/utils.h
>> +++ b/utils.h
>> @@ -19,6 +19,8 @@
>>   #ifndef __UTILS__
>>   #define __UTILS__
>>
>> +#include "ctree.h"
>> +
>>   #define BTRFS_MKFS_SYSTEM_GROUP_SIZE (4 * 1024 * 1024)
>>
>>   int make_btrfs(int fd, const char *device, const char *label,
>> @@ -46,4 +48,5 @@ int check_label(char *input);
>>   int get_mountpt(char *dev, char *mntpt, size_t size);
>>
>>   int btrfs_scan_block_devices(int run_ioctl);
>> +int open_file_or_dir(const char *fname);
>>   #endif
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to